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

本文关键字:注册 类型 初始化 autofacc 使用 | 更新日期: 2023-09-27 18:13:52

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

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

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

我用它来处理只有默认公共构造函数的类型和有依赖关系但都失败的类型。

EDIT:添加代码。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);

EDIT 2:关于一些注释,是的,我知道这些类型没有事先注册,但这种情况发生是因为容器在调用此代码时已经完全构建。我正在寻找是否有一种绕过它的方法(毕竟我为Autofac提供了一种既具体又可构造的类型)

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

您最终正在寻找注册源吗?如果是,请参阅AnyConcreteTypeNotAlreadyRegisteredSource:

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

虽然我愿意使用其他框架

你可以使用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
    }
}