Как внедрить ninject в статический класс с помощью функций расширения - PullRequest
5 голосов
/ 14 мая 2010

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

Теперь иногда мне нужно создать новый IRepository в этих функциях расширения.

В настоящее время я работаю над этим, обращаясь к своему ядру Ninject через объект, который расширяю, но это действительно ужасно:

public static IEnumerable<ISomething> GetSomethings(this IEntity entity)
{
    using (var dataContext = entity.kernel.Get<IDataContext>())
        return dataContext.Repository<ISomething>().ToList();
}

Я также мог бы создать статический конструктор, который каким-то образом получал бы доступ к ядру Ninject с фабрики. Есть ли уже инфраструктура для этого в Ninject 2?

Кто-нибудь знает лучшее решение? Есть ли у кого-нибудь комментарии по поводу реализации бизнес-логики.

1 Ответ

4 голосов
/ 14 мая 2010

К вопросу о методах расширения и о том, как они получают материал. У вас есть два подхода:

  1. Расположение службы - есть глобальное ядро ​​и раскрывающееся меню «Расположение службы» (которое отличается от внедрения зависимости). Проблема здесь заключается в том, что ваша сущность (или ее расширения) не должна принимать свой контекст и вместо этого требовать его

  2. Поскольку вы - метод расширения, то, что вы расширяете, передает вам то, что вам нужно

Как вы более или менее догадались, это (наличие глобального ядра, которое становится местом свалки) - это то, от чего Ninject пытается вас отговорить. В общем, расширение для того, что вы используете (например, MVC или WCF), предоставит что-то, если это уместно. Например, расширение WCF имеет http://github.com/ninject/ninject.extensions.wcf/blob/master/source/Ninject.Extensions.Wcf/NinjectServiceHost.cs

Большая проблема в том, что подобные зависимости, вероятно, не должны распространяться до уровня сущности - они должны оставаться на уровне службы и распространяться оттуда (используя словарь DDD).

Вы можете найти этот ответ мной интересным, так как он немного охватывает эту тему (больше из методик Ninject с точки зрения архитектурных концепций)

...