使用Autofac进行非注册类型初始化

时间:2015-09-21 16:54:28

标签: c# dependency-injection autofac

我有一个库,它可以构建在运行时动态发现的类型实例(所有公共和非抽象)(使用反射)。

要构建那些我想使用Autofac的实例(尽管我愿意使用其他框架),以便自动合并依赖项。

问题是Autofac没有创建实例。如果我使用scope.Resolve(),它会抛出一个异常,说明该类型没有注册(由于它是在运行时动态发现的,因此它不可能)。如果我尝试使用scope.ResolveOptional(),则只返回null。

我已经将它用于只有默认公共构造函数的类型和具有依赖性且都失败的类型。

编辑:添加了代码。 types数组中返回的类型都是具有默认无参数构造函数的公共类型。

var types = AppDomain.CurrentDomain.GetAssemblies()
                                   .SelectMany(s => s.GetTypes())
                                   .Where(p => typeof(ISomeInterface).IsAssignableFrom(p) 
                                               && !p.IsAbstract
                                               && p.IsPublic).ToArray();

var instance = (ISomeInterface)_dependencyInjectionScope.Resolve(type);

编辑2:关于一些评论,是的,我知道这些类型没有事先注册,但这是因为在调用此代码时容器已经完全构建。我正在寻找周围的方法(毕竟我为Autofac提供了具体和可构造的类型)

2 个答案:

答案 0 :(得分:9)

你最终在寻找Registration Sources吗? 如果是,请参阅AnyConcreteTypeNotAlreadyRegisteredSource

var builder = new ContainerBuilder();
builder.RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSource());
var container = builder.Build();

答案 1 :(得分:0)

  

虽然我愿意使用其他框架

您可以使用Unity容器。它允许您构建任何类(而不是接口)的对象,而无需使用容器显式注册类。当然,类必须是公共的,非抽象的,具有公共构造函数,并且应该在容器中注册基于接口的依赖项。

以下是示例代码:

public interface IService
{
}

public class Service : IService
{

}

public class MyClass
{
    private readonly IService m_Service;

    public MyClass(IService service)
    {
        m_Service = service;
    }
}

class Program
{
    static void Main(string[] args)
    {
        UnityContainer container = new UnityContainer();

        container.RegisterType<IService, Service>(); //We need to register interface-based dependency

        var my_class = container.Resolve<MyClass>(); //We can resolve class-based types without registering them explicitly
    }
}
相关问题