2014-01-20 62 views
1

我处于Ninject困境中。另外,如何将我的C#解决方案中的多个区域绑定到同一个容器。总而言之,我知道通过Ninject模块进行加载是实现这一目标的最佳方法,但我无法直接访问内核(正如我所了解的那样,反模式)来拨打_kernel.Get<T>()使用Ninject注入类库,其中构造函数接受多个参数

所以我相信构造函数注入是最好的方法。现在假设我有顶层类Program,它加载Module : NinjectModule

class Program 
{ 
    IKernel _kernel; 
    public static main() 
    { 
     _kernel = new StandardKernel(); 
     _kernel.Load(ClassA.Module); 
     _kernel.Load(ClassB.Module); 

    } 
} 

为了保持代码到最低限度,假设ClassA的模块并列的ISomething所有实现对ConcreteSomething,并且ClassB(其中ClassA取决于)实现以下构造方法;

public ClassB(ISomething thing, int paramA, int paramB) 
{ 
    //Do stuff with paramA and paramB using thing 
} 

在一个单一的解决方案中,_KERNEL可以直接访问,_kernel.Get<ClassB>.WithConstructorArgument("paramA", 123).WithCon...

不过,我不确定如何这会工作,其中提供类有它的调用者容器的访问权限。

有一种想法超越了我的想法是使用工厂方法,但我不知道这是如何工作的。

任何重量将不胜感激。

+0

paramA,paramB(ClassB的ctor)的值来自哪里? – BatteryBackupUnit

回答

1

对于依赖关系,使用构造函数注入是正确的。

如何将参数(paramA,paramB)移动到方法,如初始化或执行?

如果这不合理(如其命令),那么你将需要使用工厂。 看看https://github.com/ninject/ninject.extensions.factory

对于工厂扩展不支持的用例,您始终可以拥有一个获得IResolutionRoot注入的工厂。您可以在该界面上执行获取<>。工厂可以驻留在任何组装中。

public class FactoryB : IFactoryB { 
    private readonly IResolutionRoot resolutionRoot; 
    public FactoryB(IResolutionRoot resolutionRoot) { 
     this.resolutionRoot = resolutionRoot; 
    } 

    public IClassB Create(int paramA, int paramB) { 
     return this.resolutionRoot.Get<IClassB>(new ConstructorArgument("paramA", paramA), new ConstructorArgument("paramB", paramB)); 
    } 
} 

但是,我想知道是否真的需要为paramA,paramB使用工厂。这取决于值来自何处/如何确定。它们是依赖于classA还是只是“全局配置”值?

+0

在我的情况下,这些参数将从组合根(即:'Programme aka GUI客户端)级联下来,但是,我可能需要使用中间库(本例中为'ClassA')的一些元素。就我而言,我有一个RESTful PCL,它需要为特定平台传递特定的散列/加密算法。平台声明将在组合根目录('Client。{platform}')中进行并传递给跨所有平台共享的核心客户端库。然后调用PCL,注入特定的'IHash'加密哈希。 –

+1

在这种情况下,应该很容易在组合根('Client。{platform}')中绑定'IHash',并在中间库('ClassA')。您可能想考虑基于约定的模块加载,因此您需要尽可能少地在您的“Client。{platform}”组合根目录中进行配置。 – BatteryBackupUnit

+0

我不得不放弃IoC,因为我们需要发布最低可行产品。有几个紧密耦合的类需要在核心客户端库中进行大量的工作(还有一堆PCL的困境),但是在接下来的几周重写时我会注意到这个建议。 –

相关问题