连接字符串注入

时间:2012-05-03 22:08:22

标签: ninject

我正在努力学习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()添加到绑定中,结果相同。

2 个答案:

答案 0 :(得分: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 });
}

在消费者方面,您可以在主电话上调用Ninject静态属性。

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

答案 1 :(得分:1)

内核可以跟踪所有绑定。但是,您每次都在创建一个新实例。那不行。相反,创建内核然后将其存储起来(这里我将其存储在局部变量中,但您可能希望将其存储在某个类的字段中):

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

现在通过访问现有内核来获取实例。

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

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

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