我有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
}
}
答案 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();
}
}