Я использую Ninject 1.0 и хотел бы иметь возможность вводить ленивых делегатов инициализации в конструкторы. Таким образом, учитывая общее определение делегата:Lazy generic initialitation using Ninject
public delegate T LazyGet<T>();
Я просто хотел, чтобы связать это IKernel.Get(), так что я могу передать ленивый геттер в конструкторах, например
public class Foo
{
readonly LazyGet<Bar> getBar;
public Foo(LazyGet<Bar> getBar)
{
this.getBar = getBar;
}
}
Однако, я не могу просто позвонить Bind<LazyGet<T>>()
, потому что это открытый универсальный тип. Мне нужно, чтобы это было открытым родовым, так что мне не нужно связывать все разные ленивые, чтобы получить явные типы. В приведенном выше примере должно быть возможно динамически создать общий делегат, который вызывает IKernel.Get<T>()
.
Как это можно достичь с помощью Ninject 1.0?
Инъекционного зависимость, от которой * явно * Ленивая есть, IMO, дырявая абстракция. См. Здесь для получения дополнительной информации: http://blog.ploeh.dk/2010/01/20/RebuttalConstructorOverinjectionAntipattern.aspx –
Я знаю, но я преобразовываю существующую кодовую базу, у которой много статики, которые сильно связаны. Это всего лишь промежуточный первый шаг к избавлению от всех статических классов. –
Довольно честно :) Во всяком случае, я никогда не хотел, чтобы мой комментарий был пренебрежительным. Однако сообщение, на которое я указал, делает выход из-за явной реализации лени как декоратора. Я просто не хотел предлагать это в качестве ответа, потому что вы могли бы получить правильный ответ Ninject от кого-то другого :) –