Внедрение зависимости - PullRequest
       0

Внедрение зависимости

9 голосов
/ 04 сентября 2010
public interface ITaskProvider
{
    T GetTask<T>();
}

В реализации ITaskprovider ниже, как вы видите, IUserTask и IIdentityTask внедряются из свойства вместо конструктора.Причина в том, что Windsor автоматически создает внедренные свойства во время выполнения, когда к ним обращаются, так что мне не нужно помещать все необходимые инжектированные зависимости в конструктор..

public ITaskProvider TaskProvider { get; set; }

public AuctionsController(ITaskProvider taskProvider)
        {
            TaskProvider = taskProvider;
        }

И здесь я называю TaskProvider и его методы отлично.

public ActionResult Index()
{
 var userTasks = TaskProvider.GetTask<IUserTasks>();
 var user = userTasks.FindbyId(guid);

}

Здесь все работает нормально.

Мне сказали, что это больше похоже на шаблон поиска служб и нарушает шаблон внедрения зависимостей, и я хочу знать, что здесь нарушается.

Ответы [ 4 ]

4 голосов
/ 04 сентября 2010

Для меня, в вашем коде нет нарушения DI в отношении wikipedia :

основной принцип, чтобы отделить поведение от разрешения зависимостей

Но с плохой стороны у вашего контроллера слишком много знаний, в некоторых случаях (если вы не программируете внимательно) вы можете нарушить Закон Деметры

взгляните на ваш код:

public ActionResult Index()
{
 var userTasks = TaskProvider.GetTask<IUserTasks>();
 var user = userTasks.FindbyId(guid);
}
2 голосов
/ 04 сентября 2010

Вы используете Dependency Injection для внедрения того, что фактически является «локатором службы», в контроллер, а не для внедрения реализации IUserTasks и IIdentityTasks.

Ваш реальный контроллер действительно имеет зависимости от IUserTasks и IIdentityTasks, но выне впрыскивая их напрямую в ваш контроллер, вместо этого решив использовать «Локатор служб» или «Поставщик задач», и, следовательно, вы ввели зависимость от локатора служб, которая в этом примере, кажется, не дает ничего, что нельзя было бы сделать, просто внедрив истинные зависимости напрямую,

2 голосов
/ 04 сентября 2010

Если контроллеру требуется экземпляр IUserTasks, было бы проще, если бы он получил его непосредственно из контейнера.По сути, TaskProvider - это просто оболочка вокруг контейнера, так как именно туда он получает экземпляры UserTasks и IdentityTasks.

1 голос
/ 04 сентября 2010

Вы должны внедрить IUserTask и IIdentityTask в конструктор контроллера, так как нет никакой выгоды в использовании TaskProvider. Кроме того, в том, как вы это сделали, вы пропускаете некоторые проверки времени компиляции. Например, вы можете вызвать TaskProvider.GetTask () и подождать, чтобы взорваться во время выполнения. Вы должны, по крайней мере, наложить некоторое ограничение на этот общий параметр (если возможно, чтобы оба интерфейса наследовали от общего родителя).

Что касается "нарушения", вы должны заметить, что вы не вводите зависимости в контроллер. Вы предоставляете способ получить их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...