Aby rozpocząć, używam programu Ninject 1.5. Mam dwa projekty: projekt internetowy i bibliotekę klasy. Moja konfiguracja DI znajduje się w projekcie WWW. W moim klasy biblioteki Mam następującą definicją:Ninject: Jak mogę wstrzyknąć do biblioteki klas?
public interface ICacheService<T>
{
string Identifier { get; }
T Get();
void Set(T objectToCache, TimeSpan timeSpan);
bool Exists();
}
A potem beton klasy o nazwie CategoryCacheService.
W moim projekcie internetowej wiążę dwa:
Bind(typeof(ICacheService<List<Category>>)).To(typeof(CategoryCacheService)).Using<SingletonBehavior>();
w mojej klasie biblioteki Mam metody rozszerzenie dla klasy HtmlHelper, na przykład:
public static class Category
{
[Inject]
public static ICacheService<List<Category>> Categories { get; set; }
public static string RenderCategories(this HtmlHelper htmlHelper)
{
var c = Categories.Get();
return string.Join(", ", c.Select(s => s.Name).ToArray());
}
}
Powiedziano mi, że Ciebie nie mogę wstrzyknąć do właściwości statycznych, zamiast tego powinienem użyć Kernel.Get <>() - Jednak ... Ponieważ powyższy kod znajduje się w bibliotece klas, nie mam dostępu do jądra. Jak mogę zdobyć jądro od tego punktu, czy jest lepszy sposób na zrobienie tego?
Ruben, CacheServiceResolver wydaje mi się właściwym pomysłem, ponieważ Mogę ponownie wykorzystać ten wzorzec w przyszłości. Czy masz jakieś przykłady dotyczące konfigurowania programu tłumaczącego? – DennyFerra
Niestety nie mam jednego do ręki. Ogólną ideą byłoby to, że gdziekolwiek tworzysz swój nowy StandardKernel, przechowujesz odniesienie do niego. Następnie masz coś tak prostego, jak 'void RegisterCacheServiceResolver (jądro jądra) {Bind(). ToConstant (nowy CacheServiceResolver (jądro));}' na jednym z modułów, do którego przekazujesz jądro. Można też utworzyć jądro, a następnie przekazać je konstruktorowi dowolnego modułu, który go potrzebuje, po czym dodaje się moduł [w przeciwieństwie do przekazywania wszystkich w konstruktorze jądra, jak zwykle]. –