Autofac Resolve 按类型使用委托工厂

Autofac Resolve using delegate factory by type

我在我的项目中将 Autofac 用于 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);
         }
     }

}

这很完美,但为了让它工作,我需要控制器的服务参数名称和委托服务参数名称相同,因为正如我所读,Autofac 将参数按名称配对!!

我看到您可以通过使用通用 Func<> 类型注册 class 来完成此操作,但是由于遗留应用程序我需要保留 "clean" 注册,即:

containerBuilder.RegisterType<MyController>();

有谁知道是否可以让委托按类型匹配参数??

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);

Does anyone know if it's possible to make the delegate match the parameter by type??

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

这是一个简单的例子:

    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
    {
    }

注册 + 使用

            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());

**请注意,如果您使用此方法,如果您尝试添加相同类型的参数,Autofac 会抛出异常。前任。 ComponentDependency

有两个依赖项

异常看起来像这样:

The input parameter type list has duplicate types. Try registering a custom delegate type instead of using a generic Func relationship.