c# - 从 Autofac 容器解析通用接口(interface)的 IEnumerable

标签 c# dependency-injection autofac

我不确定这是否可能,我看到其他一些帖子问过类似的问题,但没有一个有令人满意的答案。

我想做的是从 Autofac 解析具有不同泛型类型的接口(interface)集合。所以类的构造函数看起来像这样:

public class SomeClass<T> where T : class
{
    private readonly IEnumerable<ITestInterface<T>> _testInterfaces;

    public SomeClass(IEnumerable<ITestInterface<T>> testInterfaces)
    {
        _testInterfaces = testInterfaces;
    }
}

理想情况下,我希望能够像这样单独注册每个实例:

builder
    .RegisterType<ImplementationA>()
    .As<ITestInterface<A>>();

builder
    .RegisterType<ImplementationB>()
    .As<ITestInterface<B>>();

我已经尝试了 RegisterGeneric 等的各种组合,但 Enumerable 一直都是空的。

如有任何帮助,我们将不胜感激。

最佳答案

在尝试继承和通用约束后,我能够解决这个问题。我最终得到的解决方案如下所示:

基类/接口(interface):

public abstract class BaseClass
{
    public abstract string IAM { get; }
}

public interface ITestInterface<out T> where T : BaseClass
{
    T GetSomething();
}

实现类:

public class A : BaseClass
{
    public override string IAM => "I AM TYPE A";
}

public class AInterface : ITestInterface<A>
{
    public A GetSomething()
    {
        return new A();
    }
}

public class B : BaseClass
{
    public override string IAM => "I AM TYPE B";
}

public class BInterface : ITestInterface<B>
{
    public B GetSomething()
    {
        return new B();
    }
}

我们要解析的类:

public interface ISomeClass
{
    void DoSomething();
}

public class SomeClass<T> : ISomeClass where T : BaseClass
{
    private readonly IEnumerable<ITestInterface<T>> _testInterfaces;

    public SomeClass(IEnumerable<ITestInterface<T>> testInterfaces)
    {
        _testInterfaces = testInterfaces;
    }

    public void DoSomething()
    {
        foreach (var t in _testInterfaces)
        {
            var something = t.GetSomething();

            Console.WriteLine(something.IAM);
        }
    }
}

最后,Autofac 配置:

var builder = new ContainerBuilder();

builder
    .RegisterType<SomeClass<BaseClass>>()
    .AsSelf();

builder
    .RegisterType<AInterface>()
    .As<ITestInterface<BaseClass>>();

builder
    .RegisterType<BInterface>()
    .As<ITestInterface<BaseClass>>();

builder
    .RegisterType<SomeClass<BaseClass>>()
    .As<ISomeClass>();

var container = builder.Build();

var x = container.Resolve<ISomeClass>();

x.DoSomething();

输出:

I AM TYPE A

I AM TYPE B

希望这对以后的人有帮助。

关于c# - 从 Autofac 容器解析通用接口(interface)的 IEnumerable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37801361/

相关文章:

c# - 在没有第 3 方库的情况下在 .NET 中刻录(视频)DVD

c# - Moq 索引属性并在返回/回调中使用索引值

c# - ServiceStack:单元测试 WebServices

unit-testing - 如何单元测试实例创建?

asp.net-mvc - 使用 Autofac 将服务注入(inject)基类

c# - Linq to SQL 删除/添加子对象

c++ - 具有许多类的程序中的依赖倒置 (C++)

java - 将要通过字段注入(inject) (CDI) 初始化的测试字段

c# - 将 AutoFac 属性注入(inject)与 Moq 结合使用

c# - Autofac 与惰性元数据