我有一个接受依赖作为构造函数参数的类。这个类可能会被其他一些类继承,并且由于技术原因(关于构造函数的顺序等),我必须使用工厂方法和使用Activator.CreateInstance
的动态调用。工厂方法不纯粹是基础设施,但它内部有一些初始化逻辑。如何让Ninject在保留解析过程的同时使用特定类型的自定义构造逻辑?
public class Foo {
protected Foo(IService service, IOtherService otherService) { ... }
...
public Foo Create(Type fooType, params object[] constructorArgs) {
var instance (Foo)Activator.CreateInstance(fooType, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.CreateInstance, constructorArgs, null, null); // or something similar...
instance.SetDefaultValues(); // for example...
instance.StartChangeNotifications();
return instance;
}
可能的后代可以采取更多的依赖性等。我想仍然使用Ninject来解决依赖关系并创建对象树。
但是,使用ToMethod
绑定我必须创建自己的整个子树。有什么办法可以在解析过程中自定义只有特定类型的构造?
我想这样使用它。
kernel.Bind<ConcreteFoo>().ConstructWith(ctx => Foo.Create(ctx.Request.Service, ctx.Arguments));
其中ConstructWith
和ctx.Arguments
都是虚构的部分。我希望我的问题清楚。
你为什么坚定的关于使用'Activator.CreateInstance'? ninject不能做什么?请注意,有很多方法来参数化ninject的分解/构造,比如'ToConstructor'绑定或'WithConstructorArgument'扩展...... – BatteryBackupUnit
我正在使用它,因为我在工厂方法中有其他的东西,我刚刚省略了它们明晰。我用一些示例行更新了我的帖子。工厂方法中有逻辑,它不仅是基础代码。我知道有很多方法可以将参数传递给解析,但我需要一个不同的东西。 –
使用'ToMethod',你仍然使用'IContext'来创建依赖关系。使用'OnActivation'你可以完成初始化的东西,比如'SetDefaultValues' ...,然后还有'ToConstructor'来选择构造函数并指定要注入的内容。 – BatteryBackupUnit