c# - 如何使用同一接口(interface)注入(inject)两个或多个依赖项?

标签 c# autofac

考虑以下代码

public interface ISomeInterface
{
    void DoSomething();
}

public class A : ISomeInterface
{
    public void DoSomething() { }
}

public class B : ISomeInterface
{
    public void DoSomething() { }
}

然后一个类使用 2 个接口(interface):

public class C : IC
{
    protected ISomeInterface _dependency1;
    protected ISomeInterface _dependency2;

    public C ( ISomeInterface dependency1, ISomeInterface dependency2 )
    {
        _dependency1 = dependency1;
        _dependency2 = dependency2;
    }
}

我想在 dependency1 中注入(inject) A,在 dependency2 中​​注入(inject) B。我知道我可以做这样的事情:

builder.RegisterType<C>().As<IC>()
    .WithParameter( "dependency1", new A() )
    .WithParameter( "dependency2", new B() );

但我知道使用 Autofac 有更好的方法。

最佳答案

当您注册您的ISomeInterface 植入时,您可以提供them a name :

containerBuilder.RegisterType<A>().Named<ISomeInterface>("A");
containerBuilder.RegisterType<B>().Named<ISomeInterface>("B");

然后您可以注册您的 C 以使用定义的名称解析它的参数:

containerBuilder.Register(c =>
    new C(c.ResolveNamed<ISomeInterface>("A"), 
        c.ResolveNamed<ISomeInterface>("B")))
    .As<IC>();

使用上面的代码,即使某些参数不需要“命名”注册,您也必须指定 C 的所有构造函数参数。

因此,如果您只想指定“命名”参数,您可以将 WithParameter 与解析一起使用:

containerBuilder.RegisterType<C>().As<IC>()
    .WithParameter((p, c) => p.Name == "dependency1", 
                   (p, c) => c.ResolveNamed<ISomeInterface>("A"))
    .WithParameter((p, c) => p.Name == "dependency2", 
                   (p, c) => c.ResolveNamed<ISomeInterface>("B"));

关于c# - 如何使用同一接口(interface)注入(inject)两个或多个依赖项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13089454/

相关文章:

c# - 这两个 List 初始化是否相同?

c# - 对 Autofac 模块进行单元测试以达到 100% 的代码覆盖率

inversion-of-control - 基于构造函数参数属性使用autofac解决依赖关系

autofac - 如何使用 Autofac 注册(无限)类型层次结构?

c# - 通过 C# 递归通知子控件

c# - 无法匹配 C# 中的时间

c# - 调试时在 Visual Studio 中的 C# 应用程序和 C 控制台应用程序之间传递数据

c# - 在提交作业之前从编码任务中获取 Asset.ID

c# - 使用 Autofac 作为服务定位器

c# - 找不到类型 'projectname.Repositories.IRepository'。它可能需要装配资格,例如 "MyType, MyAssembly"