0

我有ConverterTest需要访问课程的ValidateTest课程。我不能ValidateTest使用构造函数传递,因为ConverterTest它是抽象类。如果我引入第二个构造函数来绑定ValidateTest,我会在派生类中遇到很多问题,很多事情都需要改变。所以我试图传递ValidateTestConverterTest使用属性注入(用注入属性装饰),但这也不起作用,因为ConverterTest不是由 Ninject 创建的,并且注入属性被忽略。所以我决定直接在ValidateTest类中创建实例属性并绑定自身的实例。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();

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

public abstract class ConverterTest
{

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

1 回答 1

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();
     }
}
于 2012-04-17T14:18:31.900 回答