如何使用 Microsoft.Extensions.DependencyInjection 将多个服务添加为一个对象

问题描述 投票:0回答:1

我有类似这样的服务

public class Dependency1 { }
public class Dependency2 { }

public interface Interface1 { }
public interface Interface2 { }

public class Service : Interface1, Interface2
{
    public Service(Dependency1 dependency1, Dependency2 dependency2)
    {

    }
}

问题是,如果您将服务添加为 Interface1 和 Interface2,您会得到两个不同的对象。

var services = new ServiceCollection();

services.AddSingleton<Dependency1>();
services.AddSingleton<Dependency2>();

services.AddSingleton<Interface1, Service>();
services.AddSingleton<Interface2, Service>();

var factory = new DefaultServiceProviderFactory();
var provider = factory.CreateServiceProvider(services);
var i1 = provider.GetService<Interface1>();
var i2 = provider.GetService<Interface2>();

Console.WriteLine(i1 == i2);

我什至通过打印参考文献来仔细检查这一点

        unsafe
        {
            TypedReference tr1 = __makeref(i1);
            IntPtr ptr1 = **(IntPtr**)(&tr1);
            Console.WriteLine(ptr1);

            TypedReference tr2 = __makeref(i2);
            IntPtr ptr2 = **(IntPtr**)(&tr2);
            Console.WriteLine(ptr2);
        }

我知道你可以让两个服务引用一个对象:

var service = new Service(new Dependency1(), new Dependency2());
services.AddSingleton<Interface1>(service);
services.AddSingleton<Interface2>(service);

但是在这种情况下,您必须使用构造函数创建对象,但依赖项注入的要点是您不必手动执行此操作。另外,在某些情况下您无法访问某些依赖项。

c# dependency-injection
1个回答
0
投票

对接口使用工厂方法:

services.AddSingleton<Service>();
services.AddSingleton<Interface1>(services=>services.GetService<Service>());
services.AddSingleton<Interface2>(services=>services.GetService<Service>());

由于

Service
本身注册为单例,每次类请求
Interface1
Interface2

时都会返回相同的实例
© www.soinside.com 2019 - 2024. All rights reserved.