ASP.NET MVP Зависимость от инъекционных услуг - PullRequest
4 голосов
/ 11 ноября 2009

У меня есть страница ASP.NET, которая реализует мое представление и создает презентатор в конструкторе страниц. Предоставление поста Фила Хаака использовалось в качестве отправной точки , и я просто приведу примеры из этого поста, чтобы проиллюстрировать вопрос.

public partial class _Default : System.Web.UI.Page, IPostEditView {

    PostEditController controller;
    public _Default()
    {
         this.controller = new PostEditController(this, new BlogDataService());
    }
}

Каков наилучший подход для внедрения экземпляра BlogDataService? Примеры, которые я нашел, используют свойства в классе Page для зависимости, помеченной атрибутом, который разрешает инфраструктура внедрения.

Однако я предпочитаю использовать конструкторский подход для тестирования.

Есть ли у кого-нибудь вход или, возможно, ссылки на хорошие реализации вышеперечисленного. Я бы предпочел Ninject, но StructureMap или Windsor будут в порядке, пока он свободно владеет.

Спасибо за любые отзывы.

Ответы [ 3 ]

2 голосов
/ 11 ноября 2009

В нашей доморощенной MVP-среде у нас был типизированный базовый класс, от которого унаследованы все страницы. Тип должен быть типа Presenter (наш базовый класс Presenter)

В базовом классе мы затем инициализировали контроллер, используя IoC-контейнер.

Пример кода:

public class EditPage : BasePage<EditController> {
}

public class EditController : Presenter {
 public EditController(IService service) { }
}

public class BasePage<T> : Page where T: Presenter
{
 T Presenter { get; set; }
 public BasePage() { 
  Presenter = ObjectFactory.GetInstance<T>(); //StructureMap
 }
}

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

1 голос
/ 11 ноября 2009

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

Однако autofac (контейнер DI, который мне очень нравится) имеет модуль интеграции для ASP.NET WebForms , который выполняет внедрение свойства без атрибутов - ваш код будет выглядеть следующим образом:

public partial class _Default : System.Web.UI.Page, IPostEditView {

    public IBlogDataService DataService{get;set;}
    public _Default()
    {
    }
}

Я знаю, что это конкретно не решает ваше желание использовать инжектор конструктора, но это самое близкое из известных мне.

1 голос
/ 11 ноября 2009

Если вы используете Microsoft ServiceLocator , вы можете применить шаблон проектирования локатора службы и запросить контейнер для службы.

В вашем случае это будет выглядеть примерно так:

public partial class _Default : System.Web.UI.Page, IPostEditView {

    PostEditController controller;
    public _Default()
    {
         var service = ServiceLocator.Current.GetInstance<IBlogDataService>();
         this.controller = new PostEditController(this, service);
    }
}

ServiceLocator имеет реализации для Castle Windsor и StructureMap. Не уверен насчет Ninject, но создание адаптера ServiceLocator для нового IoC тривиально.

...