Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Autofac进行非注册类型初始化_C#_Dependency Injection_Autofac - Fatal编程技术网

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

C# 使用Autofac进行非注册类型初始化,c#,dependency-injection,autofac,C#,Dependency Injection,Autofac,我有一个库,它构建它在运行时(使用反射)动态发现的类型(所有公共和非抽象)的实例 为了构建这些实例,我希望使用Autofac(尽管我愿意使用其他框架),以便自动合并依赖项 问题是Autofac没有创建实例。如果我使用scope.Resolve(),它会抛出一个异常,表示该类型未注册(因为它是在运行时动态发现的,所以不能注册)。如果我尝试使用scope.ResolveOptional()它只返回null 我将它用于只有默认公共构造函数的类型和具有依赖项且两者都失败的类型 编辑:添加了代码。type

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

为了构建这些实例,我希望使用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提供了一种既具体又可构造的类型)

尽管我愿意使用其他框架

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

下面是一个示例代码:

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
    }
}
公共接口iSeries设备
{
}
公共课服务:IService
{
}
公共类MyClass
{
私人只读设备m_服务;
公共MyClass(iSeries服务)
{
m_服务=服务;
}
}
班级计划
{
静态void Main(字符串[]参数)
{
UnityContainer容器=新的UnityContainer();
container.RegisterType();//我们需要注册基于接口的依赖项
var my_class=container.Resolve();//我们可以解析基于类的类型,而无需显式注册它们
}
}

你最终要找的是什么? 如有,请参阅:


如何在添加Autofac之前创建对象的实例?现在我只使用Activator.CreateInstance和默认构造函数。但是由于我希望能够注入依赖项,这不是一个特别好的机制。您需要共享一些代码,否则我们只能猜测…@thepirat000您确定吗?问题是Autofac没有创建实例。。。引发异常,表示未注册该类型可能表示未注册动态运行时解析。但是,只是一个猜测。为什么在这里建议团结?使用Autofac也可以做到这一点:
builder.RegisterType().as()
-我仍然不明白这个答案的要点…Autofac是否支持在不注册MyClass的情况下解析MyClass?不明确注册MyClass?部分地,通过,但更好地与。在我看来,这就是问题所在。他们希望能够在不显式注册的情况下构造对象,因为他们在运行时发现它。Unity可以在不注册的情况下解析基于类的对象。我不是Unity的粉丝。我不是DI容器的粉丝。我首先鼓励人们不要使用它们。见我的文章。但是Unity有一个我认为Autofac没有的特性。这是在不注册的情况下解析基于类的对象的能力。我仍然看不出您如何在Autofac中做到这一点。另外,请注意,在问题中,他们表示他们愿意使用另一个容器。我知道许多其他人肯定和我有同样的问题。因此,简单的答案是:)这可以通过配置(app.config)而不是修改代码来添加吗?
var builder = new ContainerBuilder();
builder.RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSource());
var container = builder.Build();