【问题标题】:How to resolve instances with constructor parameters in custom IOC Container?如何在自定义 IOC 容器中使用构造函数参数解析实例?
【发布时间】:2009-01-21 14:05:17
【问题描述】:

我正在尝试构建自己的控制反转容器。现在我将对象及其类型存储在字典中,并在被询问时解析引用。但我想让解析引用或新实例成为可能。我可以使用 Activator 类创建一个新实例。但是,如果要解析的对象的构造函数接受 1、2 或任何参数怎么办?

例如,我希望能够这样说:

Container.register<IFoo>(new Foo(Proxy));
Container.register<IBar>(new Boo(Proxy, DataThing));

然后像这样解决它

IFoo MyFoo = Resolver.resolve<IFoo>();
IBar MyBar = Resolver.resolve<IBar>();

MyFoo 用给定参数 Proxy 实例化,MyBar 用 ProxyDataThing 实例化。

resolve 必须做什么才能实现这一目标?

【问题讨论】:

    标签: c# dependency-injection inversion-of-control ioc-container


    【解决方案1】:

    结帐http://funq.codeplex.com。这是一个非常小的容器,它使用 lambda 表达式来定义要解析的函数。处理多个参数。

    【讨论】:

      【解决方案2】:

      我决定将其拆分为方法。一个 Resolve,它返回存储在容器中的实例。还有一个 Create 实例化一个新实例。

      类似:

       public T Create<T>()
               {
                   if (registeredTypes.ContainsKey(typeof(T)))
                       return (T)Activator.CreateInstance(registeredTypes[typeof(T)].
                                                                             GetType());
                   else
                       throw new DependencyResolverException("Can't
                                             create type. Type " + typeof(T) + "
                                                                 not found.");
               }
      

      【讨论】:

        【解决方案3】:

        Activator 可以创建具有带参数的构造函数的类的实例。

        看看CreateInstance 方法的这个重载。

        您可以提供自定义binder 手动搜索匹配的构造函数。

        在您的情况下,resolve 方法应该返回对注册类实例的引用(在您的示例中为 new Boo(Proxy, DataThing))

        【讨论】:

        • 为什么是引用而不是新实例?这是否意味着如果我在 6 个地方解决这个 Boo,所有 6 个都是 1?
        • 为什么是新实例?通常“解决”方法会返回现有项目。如果您需要一个新实例,请明确指出它,即创建“创建”方法或添加一个参数。您将如何区分“获得新”和“获得现有”场景?
        • 我想在注册时明确告诉它成为单例或类似的东西:Container.register(new Foo(Proxy), true);将创建一个“获得现有”场景。
        • 顺便说一句,我忽略了 CreateInstance 的重载。我想我需要那个。你知道如何知道在构造对象时使用了哪些参数吗?
        • 如果要分析构造函数,可以使用反射。出于好奇,在已有大量解决方案的情况下,为什么需要推出自制的 IoC 容器?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-29
        • 1970-01-01
        • 2021-11-14
        • 1970-01-01
        • 2011-01-10
        • 1970-01-01
        • 2016-11-05
        相关资源
        最近更新 更多