注入类型的属性注入和设置属性

时间:2012-02-15 14:30:13

标签: c# .net dependency-injection tdd inversion-of-control

如果使用属性注入,如何设置该类型的属性?例如

public class MyClass
{
   public ITimer MyTimer {get;set;}
}

我们可以使用DI来解决ITimer,但是我们如何/在哪里定义ITimer的属性值,例如,如果你想设置Interval属性在哪里发生这种情况?

由于

2 个答案:

答案 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之外的封装计时器属性(除非可能通过反射...)

希望有所帮助。