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() 添加到绑定中,结果相同。

4

2 回答 2

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 });
}

在消费者方面,您可以调用Ninjectmain 上的静态属性。

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

于 2012-05-03T22:16:52.170 回答
1

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

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

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

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

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

此外,大多数情况下通常都有可用的插件,因此您不必自己实例化内核。但是,我不知道有一个控制台应用程序。

于 2012-05-03T22:11:58.567 回答