Инверсия контроля для вашего Инверсия контроля контейнера? - PullRequest
0 голосов
/ 01 апреля 2009

Мне недавно пришлось обновить относительно большую управляющую библиотеку, которая использует Ninject 1.0 до Ninject 2.0, чтобы помочь решить некоторые проблемы, которые у меня были с 1.0. Обновление прошло успешно, и я думаю, что Ninject 2.0 намного быстрее.

Однако, чтобы попытаться избежать этой проблемы в будущем, я создал свой собственный интерфейс для ввода полей и свойств (который по сути будет вызывать методы для контейнера IOC, который я хочу использовать в текущем веб-приложении). Так что теперь моя управляющая библиотека не зависит от какого-либо конкретного контейнера IOC, который ускорит любые изменения в этой области в будущем.

Мне было интересно, кто-нибудь еще делал то же самое?

Я доволен тем, чего он достиг, но в идеале я хотел бы обновить его. В своих элементах управления я часто создаю эти внедренные поля как защищенные и устанавливаю их в конструкторе для этого элемента управления.

IBlogService _blogService = null;
IEmailService _emailService = null;

public Templates_BlogTemplate()
{
    Inject(ref _blogService);
    Inject(ref _emailService);
}

Проблема, с которой я столкнулся, заключается в том, что мне нужно использовать «ref» для всех объектов, чтобы фактически установить свойство, и я не могу использовать это непосредственно для свойств.

Я бы предпочел сделать что-то подобное, но я не думаю, что это возможно.

IBlogService _blogService = null;
IEmailService _emailService = null;

public Templates_BlogTemplate()
{
    Inject(_blogService, _emailService);
}

У кого-нибудь есть идеи, как оптимизировать код или сделать его более понятным? Я также хотел бы избегать атрибутов, поэтому он заставляет разработчика принимать решение ввести переменную в определенный момент в элементе управления.

Все мысли и чувства приветствуются.

Спасибо

Ответы [ 2 ]

1 голос
/ 01 апреля 2009

Вы можете посмотреть на IServiceLocator , как описано Блок Гленна

Это общий интерфейс, который можно использовать для использования преимуществ IoC без жесткой зависимости от контейнера.

1 голос
/ 01 апреля 2009

Поддерживать внедрение свойств и вставлять зависимости в «this».

В моем случае у меня есть базовый класс, который вызывает StructureMap.BuildUp (this), и пользовательский элемент управления будет иметь такие свойства, как:

public IBlogService _blogService{get;set;}
public IEmailService _emailService{get;set;}

Единственная строка, специфичная для имеющейся у меня структуры, находится в базовом классе. Если ninject позволяет вам сделать это, вы можете вызвать свой код, передав ему экземпляр управления, и позволить ему вводить свойства в зависимости от его конфигурации.

...