0

我正在尝试使用 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 aboveclass 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 如何工作了大约一周而没有任何成功。就我而言,为什么会引发此异常?

还请有人将一个存储库注入的工作示例发布到单例类。

4

2 回答 2

2

Ninject 不注入静力学。将 coynverter 更改为非静态类,并在 ninject 中将其配置为 Singleton。还使用构造函数注入并使 repo 成为私有字段。

现在您可以将转换器注入到您需要它的构造函数中。

于 2012-04-11T22:48:26.190 回答
0

即使您使用的是属性注入而不是构造函数注入,我认为它仍然是

private static void RegisterServices(IKernel kernel)
{
  kernel.Bind<IServiceRepository>().To<ServiceRepository>();
}

因为 ninject 仍然只需要知道要映射到接口的具体类型

我还没有测试过,如果错了,我深表歉意。

于 2012-04-11T14:58:37.290 回答