2013-03-01 58 views
1

我的要求是非常相似,这里 问的问题 - With.Parameters.ConstructorArgument with ninject 2.0 这可能是一个愚蠢的问题 - 但是,是不是在发送参数构造函数的方法打电话给Get<IMyType>违背了解耦的哲学(我认为这是DI的主要动机)本身?
这假设IMyType的用户已知道IMyType的具体实现的构造函数。
由于无法在接口中声明构造函数参数,所以将来可能会添加另一个实现,这会在您绑定到该实现的构造函数&中采用不同的参数集。再次,根据去耦原则,Bind<IMyType>.To<ADifferentImpl>()的代码应该能够与之前编写的任何模块一起工作,该模块从Get<IMyType>获取实现对象。我试图使用Ninject下列情形

我有非常相似的要求 - 我不知道绑定时的构造函数参数的值,但只在访问时。我认为在特定情况下采取的最佳方法是与艾德里安格里戈尔的答案一致。 请让我知道是否有任何其他方法。

回答

0

我会做一个例子,我是怎么做的:

public static class DI 
{ 
    private static IKernel _kernel; 
    private static Boolean _kernelLoaded = false; 
    public static T Resolve<T>() where T : class 
    { 
     ... 
     var a = _kernel.Get<T>(); 
     return a; 
    } 
    ... 
} 

这里是类UserRepository其中有parammetrs构造:

public class UserRepository : RepositoryBase<User>, IUserRepository 
{ 
    public UserRepository(IMyContext context) 
     : base(context) 
    { 
    } 

    public void AddList(String name) 
    { 

    } 
} 

正如你可以看到我的构造函数工作只与接口的MyContext,Ninject自动给予IMyContext考试的默认构造函数,如果它注册在ninject中。

这里是ninject例如绑定:

public override void Load() 
    { 
     Bind(typeof(IUserRepository)).To(typef(UserRepository)); 
     Bind(typeof(IMyContext)).To(typeof(MyContext)); 
     ... 
    } 

所以我能得到这个库在我的代码是这样的:

 var repository = DI.Resolve<IUserRepository>(); 
     List<User> users = repository.GetAll(); 

而且它的工作,以及

+0

但是,什么如果'MyContext'对象需要使用一些特定于上下文的信息进行初始化,并且它没有默认构造函数。 'MyContext {public MyContext(string category){...}}'类,只有在我们获取存储库的代码中已知该类别?也就是说,只有在你调用'DI.Resolve ()'的代码中的那一点?如何将类别信息发送给构造函数? – 2013-03-01 05:45:30

+0

然后使用工厂模式!它适用于这种情况。 – Maris 2013-03-01 05:49:52

+0

如果您不知道如何使用它,请问我会提前给您 – Maris 2013-03-01 05:52:44