2012-05-03 60 views
1

我正在努力学习Ninject,并开始使用我认为非常简单的事情。无法使其工作。显然,我缺少一些基本的东西。连接字符串注入

因此,我有这个小控制台应用程序,它监听某个端口上的WCF调用,并将通过WCF传来的数据保存到数据库中。在解决方案中有3个项目:1.数据访问库,2. WCF的东西和3.控制台充当主机。 Ninject尚未使用。所以项目之间的依赖关系是这样的:3 - > 2 - > 1

我想开始注入控制台主机从其配置到数据访问库的连接字符串。谷歌搜索连接字符串注销带来了一些例子,但他们不完整。

其中一个例子建议在主机的main()这样的绑定:

static void Main(string[] args) 
{ 
    new StandardKernel().Bind<ConnectionStringProvider>().ToConstant(
    new ConnectionStringProvider { ConnectionString = Config.ConnectionString }); 
} 

其中ConnectionStrinProvider是只包含一个属性ConnectionString的一个简单的类。我无法弄清楚的是如何在数据访问库中实例化ConnectionStrinProvider。我试图

var csprovider = new StandardKernel().Get<ConnectionStringProvider>(); 

这是行不通的 - 这意味着它返回的供应商,而不是这是结合过程中创建的一个新的实例。我也尝试将.InSingletonScope()添加到绑定中,结果相同。

回答

1

内核就是跟踪所有绑定的内容。但是,您每次都要创建一个新实例。这是行不通的。相反,创建内核,然后存储其关闭(我在这里过将其存储在一个局部变量,但你可能会希望将其存储在一个领域中的一些类):

var connectionStringProvider = new ConnectionStringProvider { ConnectionString = Config.ConnectionString }; 
var kernel = new StandardKernel().Bind<ConnectionStringProvider>().ToConstant(connectionStringProvider); 

现在获得实例通过访问现有的内核。

var csprovider = kernel.Get<ConnectionStringProvider>(); 

话虽这么说,以这种方式使用它是错误的方式去了解它,因为这种模式被称为服务定位器模式,这是依赖注入的对立面。一般而言,您可以通过Kernel.Get或通过Kernel.Inject注入顶级类(例如,您的应用程序类具有Main方法),并且通过构造函数或[Inject]'属性正常注入所有其他依赖项。

此外,大多数情况下还有usually plugins available,因此您不必亲自实例化内核。但是,我不知道一个用于控制台应用程序。

+0

你能否提供一个如何实现我的目标,而不会出错的代码示例?我迄今为止看到的例子在Main中绑定了一些东西,并通过调用kernel.Get()来解析其他模块中的依赖关系,而不用解释内核变量来自哪里。在控制台应用程序中将它公开为某个类的静态成员将会创建从数据访问库到控制台应用程序(1 - > 3)的依赖关系,在我看来,这将首先破坏使用Ninject的目的(这是减少耦合)。 – user1373607

+0

我很高兴提供一个更完整的示例,但是您能否详细说明如何与数据访问库进行交互?你可以向我展示你在DAL中实例化/调用东西的代码(通过编辑你的问题)吗?另外,你可以提供更多的上下文(比如周围的类)来获得'ConnectionStringProvider'吗? –

2

您需要保留对您设置的内核的引用。如果每次实例化它都不起作用。

public static IKernel Ninject {get; private set;} 
static void Main(string[] args) 
{ 
    Ninject = new StandardKernel() 
    Ninject.Bind<ConnectionStringProvider>().ToConstant(
    new ConnectionStringProvider { ConnectionString = Config.ConnectionString }); 
} 

在consummer的一面,你可以调用你的主要的Ninject静态属性。

明显的注意事项:这是示例代码,在生产代码中,您可能希望为该全局静态变量进行更好的设计。

+0

这将创建从数据访问库到控制台应用程序(1 - > 3)的反向依赖关系,在我看来,这将首先破坏使用Ninject的目的(这是为了减少耦合)。 – user1373607

+0

是的。这是所有关于显而易见的注意事项。 'StandarKernel' ctor为配置模块提供过载。软件中的每一层应提供一个或多个此配置模块。正如Kirk上面所说的,你不需要/想直接在第一层引用内核来请求服务,服务应该被注入到1。 –