按类型使用委托工厂进行Autofac Resolve [英] Autofac Resolve using delegate factory by type

查看:75
本文介绍了按类型使用委托工厂进行Autofac Resolve的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在我的项目中将Autofac用于IoC.由于某些旧版软件库,我必须将一些无法解析的服务传递给控制器​​,并且必须将其作为参数传递.

I am using Autofac for IoC in my project. Due to some legacy software libraries I must pass some services to the controller that can't be resolved, and must be passed as parameter.

我已经使用委托工厂进行了通用控制,如下所示:

I've made a generic control using delegate factories like this:

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将参数BY NAME配对!

This works perfect, but for this to work I need the controller's service parameter name and the delegate service parameter name be the same, because as I have read, Autofac pairs the parameter BY NAME !!

我已经看到您可以通过使用通用Func类型注册该类来做到这一点,但是由于旧版应用程序,我将需要保留干净"的注册,即:

I've seen you can do it by type registering the class with generic Func<>, but due to the legacy app I would need to leave "clean" registrations i.e.:

containerBuilder.RegisterType<MyController>();

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

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

推荐答案

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

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

是的,您可以使用预定义的委托.请参见此处.

Yes, you can use predefined delegates. See dynamic instantiation section 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

**Be warned, if you use this method, Autofac throws an exception if you try to add parameters with of the same type. Ex. Component has two dependencies on Dependency

异常看起来像这样:

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

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

这篇关于按类型使用委托工厂进行Autofac Resolve的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆