kernel.Get获取单例实例

时间:2012-04-17 14:10:40

标签: ninject

我有ConverterTest课程,我需要访问ValidateTest课程。我无法使用构造函数传递ValidateTest,因为ConverterTest是抽象类。如果我引入第二个构造函数来绑定ValidateTest,我将在派生类中遇到许多问题,并且需要更改许多事情。因此,我尝试使用属性注入(使用inject属性修饰)将ValidateTest传递给ConverterTest,但这也不起作用,因为Ninject不会创建ConverterTest,并且会忽略注入属性。所以我决定直接在ValidateTest类中创建Instance属性并绑定它自己的实例。要在ValidateTest课程中获取ConverterTest的实例,请使用kernel.Get<ValidateTest>().Instance。一切正常,但使用kernel.Get访问实例类是个好主意吗?还有其他解决方案吗?

public class ValidateTest
{

        private readonly ISettingsRepository _settingsRepository;

        [Inject]
        public ValidateTest Instance { get; set; }

        public ValidateTest(ISettingsRepository settingsRepository)
        {
            _settingsRepository = settingsRepository;            
        }
}

结合

kernel.Bind<ISettingsRepository>().To<SettingsRepository>();
kernel.Bind<ValidateAbuse>().ToSelf().InSingletonScope();

在抽象类中使用ValidateTest获取kernel.Get的实例,其中无法使用构造函数绑定且属性绑定不起作用。

public abstract class ConverterTest
{

        public void Execute()
        {
          NinjectHelper.kernel.Get<ValidateTest>().Instance
        }
}

1 个答案:

答案 0 :(得分:1)

为什么不让ConverterTest的子类通过ConverterTest中的公开属性或自己的构造函数设置ValidateTest?

public abstract class ConverterTest
{
     protected ValidateTest ValidateTest{get;set;}

     public void Execute()
     {
         ValidateTest.ValidateStuff();
     }
}

public class ConcreteConverter : ConverterTest
{
    [Inject]
    public ConcreteConverter(ValidateTest validateTest)
    {
        base.ValidateTest = validateTest;
    }
}

或者,我认为您可以将属性设为公共public ValidateTest ValidateTest{get;set;},如果添加适当的属性,它应该适用于属性注入。

public abstract class ConverterTest
{
     [Inject]
     public ValidateTest ValidateTest{get;set;}

     public void Execute()
     {
         ValidateTest.ValidateStuff();
     }
}