我正在尝试使用Ninject将存储库绑定到属性,但始终获取绑定对象的空引用。我将使用下面的代码解释这个问题。
public interface IServiceRepository
{
User GetUser(string email);
IQueryable<Statistic> GetStatisticForCurrentMonth(string ip);
void InsertStatistic(ConversionModel conversionModel);
class ServiceRepository : IServiceRepository
{
//Implementation of the Interface
}
创建课程时,我想bind the repository above
到class below
。遗憾的是,Repository
对象始终为null
。也许我误解了Ninject是如何工作的?如何解决问题?
public class Converter
{
[Inject]
public static IServiceRepository Repository { get; set; }
private static Converter _converter;
public static Converter Instance
{
get { return _Converter ?? (_Converter = new Converter ());
}
}
Ninject激活码
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IServiceRepository>().ToMethod(context => Converter.Repository);
}
更新
我试图像这样重写代码
public class Converter
{
private readonly IServiceRepository _repository;
public Converter(IServiceRepository repository)
{
_repository = repository;
}
//skip code
}
测试......
[TestMethod]
public void ConverterInstanceCreated()
{
using (IKernel kernel = new StandardKernel())
{
kernel.Bind<IServiceRepository>().To<ServiceRepository>();
Assert.IsNotNull(kernel.Get<Converter>());
}
}
给出例外
Test method PC.Tests.NinjectTest.ConverterInstanceCreated threw exception:
Ninject.ActivationException: Error activating IServiceRepository
No matching bindings are available, and the type is not self-bindable.
Activation path:
2) Injection of dependency IServiceRepository into parameter repository of constructor of type Converter
1) Request for Converter
我刚刚输了,我试图了解Ninject如何工作一周而没有任何成功。在我的情况下,为什么抛出这个异常?
另外请有人将一个存储库注入到单例类的工作示例发布。
答案 0 :(得分:2)
Ninject不会注射静力学。将coynverter更改为非静态类,并在ninject中将其配置为Singleton。还使用构造函数注入并使repo成为私有字段。
现在您可以将转换器注入您需要的构造函数。
答案 1 :(得分:0)
即使您使用Property注入而不是Constructor注入,我认为它仍然是
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IServiceRepository>().To<ServiceRepository>();
}
因为ninject仍然需要知道要映射到接口的具体类型
如果这是错误的话,我没有对此进行过测试。