如果使用属性注入,如何设置该类型的属性?例如
public class MyClass
{
public ITimer MyTimer {get;set;}
}
我们可以使用DI来解决ITimer,但是我们如何/在哪里定义ITimer的属性值,例如,如果你想设置Interval属性在哪里发生这种情况?
由于
答案 0 :(得分:3)
如果您知道需要注入ITimer
的{{1}}的特定设置,则可以在MyClass
属性的设置器中执行此操作。
Timer
实际上,构造函数注入为您提供了更多的灵活性。
答案 1 :(得分:0)
请澄清一下......如果你想设置Interval属性,你的意思是什么呢?如果你正在寻找何时设置ITimer的属性,我更喜欢使用一种更好的可读性和维护方法:
public class MyClass {
private ITimer timer;
public ITimer Timer {
get { return timer; }
set { SetDefaultTimer(value); }
}
private void SetDefaultTimer(ITimer timer) {
timer.Interval = 1000;
// other default properties
// assign
this.timer = timer;
}
}
我不相信这会阻止某人更改Timer上的间隔或其他属性。我不知道这是不是你的意图。
<强>更新强>
根据您的ITimer界面,您可以完全隐藏Interval属性,这意味着由于封装而无法更改间隔。通过封装公开interval属性需要如下所示:
public interface ITimer {
int Interval {get; set;}
}
...暴露了一种设置间隔值的方法 - 例如:
public class MyTimer : ITimer {
Timer timer;
// implement ITimer member
public int Interval {
get { return timer.Interval; }
set { timer.Interval = value; }
}
}
如果接口没有定义属性,则无法访问受控API之外的封装计时器属性(除非可能通过反射...)
希望有所帮助。