C# Autofac使用代理工厂按类型解析

C# Autofac使用代理工厂按类型解析,c#,dependency-injection,inversion-of-control,autofac,C#,Dependency Injection,Inversion Of Control,Autofac,我正在我的项目中使用Autofac for IoC。由于一些遗留软件库,我必须将一些无法解析的服务传递给控制器,并且必须作为参数传递 我使用委托工厂创建了一个通用控件,如下所示: public MyClass<TController, TInterface> { private delegate TController ControllerFactory(TInterface service); protected TController _myControl

我正在我的项目中使用Autofac for IoC。由于一些遗留软件库,我必须将一些无法解析的服务传递给控制器,并且必须作为参数传递

我使用委托工厂创建了一个通用控件,如下所示:

public MyClass<TController, TInterface> {

     private delegate TController ControllerFactory(TInterface service);

     protected TController _myController;
     protected TController Controller {
         get
         {
             return _controller 
               ?? (_controller = ServiceLocator.Resolve<ControllerFactory>()
                                    .Invoke(this);
         }
     }

}
公共MyClass{
私人委托TController ControllerFactory(TInterface服务);
受保护的t控制器\u myController;
受保护的控制器{
得到
{
返回控制器
(_controller=ServiceLocator.Resolve()
.援引(本);
}
}
}
这工作得很完美,但要使其工作,我需要控制器的服务参数名称和代理服务参数名称相同,因为正如我所读到的,Autofac按名称配对参数

我已经看到,您可以通过键入使用泛型Func注册类来完成此操作,但由于传统应用,我需要保留“干净”注册,即:

containerBuilder.RegisterType<MyController>();
containerBuilder.RegisterType();

是否有人知道是否可以按类型使委托与参数匹配???

Autofac比大多数DI容器更具体地说明您将控制器注册为什么类型。如果您包含
.AsSelf(),它将仅按类型解析类型
注册控制器。下面是我们在项目中用于注册MVC控制器的模块

public class MvcModule
    : Module
{
    protected override void Load(ContainerBuilder builder)
    {
        var currentAssembly = typeof(MvcModule).Assembly;

        builder.RegisterAssemblyTypes(currentAssembly)
            .Where(t => typeof(IController).IsAssignableFrom(t))
            .AsImplementedInterfaces()
            .AsSelf()
            .InstancePerDependency();
    }
}
使用此注册,可以按控制器类型解析每个控制器

var type = typeof(HomeController);
var controller = container.Resolve(type);
有人知道是否有可能使委托按类型匹配参数吗

是的,您可以使用预定义的委托。请参阅动态实例化部分

下面是一个简单的例子:

    public class ComponentFactory
    {
        private readonly Func<Dependency, Component> _componentFactory;

        public ComponentFactory(Func<Dependency, Component> componentFactory)
        {
            _componentFactory = componentFactory;
        }

        public Component Create(Dependency dependency)
        {
            return _componentFactory(dependency);
        }
    }

    public class Component
    {
        private readonly Dependency _dependency;

        public Component(Dependency dependency)
        {
            _dependency = dependency;
        }
    }

    public class Dependency
    {
    }
公共类组件工厂
{
私有只读功能组件工厂;
公共组件工厂(Func ComponentFactory)
{
_componentFactory=componentFactory;
}
公共组件创建(依赖项)
{
返回组件工厂(依赖项);
}
}
公共类组件
{
私有只读依赖项_依赖项;
公共组件(依赖项)
{
_依赖=依赖;
}
}
公共类依赖关系
{
}
注册+使用

            var builder= new ContainerBuilder();
            builder.RegisterType<ComponentFactory>();
            builder.RegisterType<Component>();
            builder.RegisterType<Dependency>();

            var container = builder.Build();
            var factory = container.Resolve<ComponentFactory>();

            //Usage with typed parameters
            var component = factory.Create(new Dependency());
var builder=newcontainerbuilder();
RegisterType();
RegisterType();
RegisterType();
var container=builder.Build();
var factory=container.Resolve();
//使用类型化参数
var component=factory.Create(新依赖项());
**请注意,如果使用此方法,如果尝试添加具有相同类型的参数,Autofac将引发异常。例如,
组件
依赖项

异常情况如下所示:

输入参数类型列表 具有重复的类型。请尝试注册自定义委托类型,而不是 使用泛型Func关系


对不起…也许我表达得不太正确。我的问题是解决代理工厂的问题,而不是注册本身的问题…我试图建立一个“基础”类,该类将解析通用控制器,但我不想使用任何特殊注册。当然,该控制器将被注册…感谢您的输入…无论如何,由于项目中的架构问题,我无法实现此解决方案,由于遗留兼容性原因,我无法更改此解决方案…但我将记住这一点,以备将来使用实现!