У меня есть следующий код в моем Global.aspx
protected override void OnApplicationStarted()
{
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
RegisterAllControllersIn(Assembly.GetExecutingAssembly());
}
protected override IKernel CreateKernel()
{
return new StandardKernel(new ServiceModule());
}
У меня также есть следующий Модуль Ninject:
internal class ServiceModule : NinjectModule
{
public override void Load()
{
Bind<IProductService>().To<ProductService>().InRequestScope();
}
}
У меня также есть основной контроллер:
public class BaseController : Controller
{
[Inject]
public IProductService ProductService
{
get;
set;
}
}
Этот код работы. Проблема, которую я имею, состоит в том, что я хотел бы удалить вводить атрибут из основного контроллера и указать это в Ninject ServiceModule вместо этого. Я другие слова, как я пошел бы о записи обязательного правила в ServiceModule, который говорит Ninject вводить ProductService в свойство в основном контроллере?
Если я удалю атрибут, то я получу NullReferenceException.
Связывание на основе соглашений существует в http://github.com/ninject/ninject.extensions.conventions - один реализует IBindingGenerator
. Однако это в значительной степени связано с обнаружением интерфейсов и сервисов.
В общем, внедрение конструктора - хороший подход по умолчанию. Однако способ, которым работает ASP.NET MVC, усложняет выполнение этой задачи (следовательно, FubuMVC и т. Д.). Так что инъекция свойств - следующий лучший вариант.
Вы можете обнаружить, что использование OnActivation
в вашем Bind
может позволить вам сделать достаточно - и если вы можете, это самый простой вариант.
Я бы охарактеризовал то, что вы пытаетесь сделать, как активацию, основанную на соглашении. Проблемы заключаются в следующем:
выбор того, что вы собираетесь вводить автоматически. Вы собираетесь выкладывать все, что не является конкретным? Все, о чем знает ваше ядро? Если вы не дадите четкого определения того, что вы хотите делать, процесс инъекции может стать непредсказуемым и трудным для понимания. Вы в конечном итоге отлаживаете и много объясняете коллегам.
что делает его эффективным. Ninject динамически генерирует код за кулисами, чтобы сделать активацию экземпляра эффективной (т. Е. Во время прохождения класса, ищущего маркеры [Inject]
, он генерирует код один раз для выполнения этого, который затем запускается, как если бы вы бы написали это от руки).
Заглянув в код, нет простого способа OOTB. Похоже, добавление пользовательской IInjectionHeuristic
поможет.
Однако, если вы глубоко погружаетесь в контейнеры, вам нужно