2013-04-22 100 views
1

我做了一个MainFactory,它将解析我的类的所有依赖关系,但是我想使用Ninject来使它自动解析构造函数参数。使Ninject解析ToMethod绑定

所以,我想接口对我厂的绑定方法,像这样

kernel.Bind<ILoggerContainer>().ToMethod(m => MainFactory.CreateLoggerContainer()); 

,但是,当我绑定的东西,依赖于ILoggerContainer,我需要指定的方法来解决这样

kernel.Bind<IUsersContainer>().ToMethod(m => MainFactory.CreateUsersServiceContainer(kernel.Get<ILoggerContainer>())); 

其他容器现在我敢肯定有一个更好的办法尤其是因为Ninject的主要目的是自动解决这些依赖关系。

编辑: 的MainFactory是在一个单独的项目,该项目将包含所有的依赖关系,因此,如果依赖的变化,我只需要更新的DLL。

的ninject使用,这样我可以设置构造带一个接口作为参数的执行,它就会自动设置,

的主要问题是如何使这项

kernel.Bind<IUsersContainer>().ToMethod(m => MainFactory.CreateUsersServiceContainer(kernel.Get<ILoggerContainer>())); 

弄成这个样子

kernel.Bind<IUsersContainer>().ToMethod(m => MainFactory.CreateUsersServiceContainer()); 

注CreateUsersServiceContainer的参数取出和我假设Ninject可以填补其参数与T他正确的价值(已经绑定在Ninject)

回答

0

我不太确定你的问题是什么,但它看起来像你试图做的是使用你的MainFactory类建立所有其他类,但也使用Ninject构建“二级”依赖关系。

对我来说,这似乎是一个非常奇怪的方法。是否有一个特殊的原因需要您使用MainFactory来组成顶级对象?这将表明一个设计问题,其中一个“上帝对象”被用来做很多事情。每当一个类需要一个新的依赖关系时,你还必须改变你的Ninject绑定和你的方法,这首先会破坏使用依赖注入框架的观点。

是否有可能用适当的Ninject绑定代替MainFactory,如果在运行时需要某些东西,可能使用Ninject提供程序/工厂来构建对象?例如,如果你的MainFactory有这样的事情:

public class MainFactory 
{ 
    public static IFoo CreateFoo(ILogger log) 
    { 
     return new Foo(log); 
    } 
} 

IFoo foo = MainFactory.CreateFoo(kernel.Get<ILogger>()); 

您可以用替换此:

kernel.Bind<ILogger>().To<FileLogger>(); 
kernel.Bind<IFoo>().To<Foo>(); 
IFoo foo = kernel.Get<IFoo>(); 

这是一个非常标准的Ninject方法。如果您需要在运行时提供值再看看在Ninject Factory Extension做这样的事情:

public class Foo 
{ 
    public Foo(string runtimeArg) { ... } 
} 

public interface FooFactory 
{ 
    IFoo CreateFoo(string runtimeArg); 
} 

kernel.Bind<IFoo>().To<Foo>(); 
kernel.Bind<IFooFactory>().ToFactory(); 
IFooFactory factory = kernel.Get<IFooFactory>(); 
IFoo foo = factory.CreateFoo("my runtime value"); 
+0

我有没有想过什么需要,当我创建一个新的依赖改变,我想你可能是对的在用适当的Bindings替换MainFactory时,我只是想在未来需要时将设计留给添加AOP修饰器。 – user579889 2013-04-23 17:02:44