如何在自定义IOC容器中使用构造函数参数解析实例?

时间:2009-01-21 14:05:17

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

我正在尝试构建自己的控制容器反转。现在我将带有类型的对象存储在字典中,并在询问时解析引用。但我希望能够解析引用或新实例。我可以使用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使用给定参数代理和MyBar与代理 DataThing 进行实例化。

解决需要做些什么来实现这一目标?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

类似的东西:

 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.");
         }

答案 2 :(得分:0)

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

看一下CreateInstance方法的重载。

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

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