Внедрение свойств и установка свойств для введенного типа - PullRequest
1 голос
/ 15 февраля 2012

Если вы используете инъекцию свойств, как вы устанавливаете свойства для этого типа? Например

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

Мы можем использовать DI для разрешения ITimer, но как / где мы определяем значения свойств для ITimer, например, если вы хотите установить свойство Interval, где это происходит?

Спасибо

Ответы [ 2 ]

3 голосов
/ 15 февраля 2012

Если вы знаете, что вам нужны определенные настройки для ITimer, который вводится в MyClass, вы можете выполнить эту работу в установщике свойства Timer.

public class MyClass
{
    private ITimer _timer;

    public ITimer Timer
    {
        get { return _timer; }
        set 
        {
            if(_timer = null && value != null && value.Interval == 0)
            {
                value.Interval = 5000;
            }

            _timer = value;
        }
}

Действительно,Внедрение в конструктор дает вам гораздо больше гибкости для такого рода вещей.

0 голосов
/ 15 февраля 2012

Пожалуйста, уточните ... что вы подразумеваете под ', если вы хотите установить свойство 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;
    }
}

Я не верю, что это остановит кого-то от изменения интервала или других свойств таймера.Я не знаю, является ли это вашим намерением.

Обновление:
В зависимости от вашего интерфейса 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 (за исключением, может быть, путем отражения ...)

Надеюсь, это поможет.

...