#.net #dependency-injection #moryx
#.net #внедрение зависимостей #moryx
Вопрос:
Я просто начинаю писать некоторые тесты для моего проекта moryx. Поэтому мне нужно немного ослабить некоторые зависимости. Итак, я попытался внедрить зависимость моего плагина в «стороннюю» реализацию. (На самом деле это не сторонняя компания, но она находится в другом проекте, и я добавляю ее в свой проект через nuget.) Таким образом, интерфейс и его реализация являются частью сторонней библиотеки.
Есть ли способ зарегистрировать интерфейс и установить его реализацию в Moryx.Runtime.Контейнер, чтобы он был введен? Или мне нужно написать оболочку?
Это то, что я пробовал: (Это не работает :))
[ServerModule(ModuleName)]
public class ModuleController : ServerModuleBase<ModuleConfig>
{
//...
protected override void OnInitialize()
{
Container.Register<IThirdPartyInterface>();
var thirdPartyImplementation = new ThirdPartyImplementation();
Container.SetInstance(thirdPartyImplementation);
}
//...
}
[Plugin(LifeCycle.Singleton, typeof(IMyPlugin), Name = nameof(MyPlugin))]
internal class MyPlugin: IMyPlugin
{
public IThirdPartyInterface ThirdPartyImplementation {get;set;}
}
Кстати: DI работает, если изменить тип свойства на MyPlugin
ThirdPartyImplementation
, но мне нужен интерфейс для тестирования…
Ответ №1:
Да, вы можете. Сначала позвольте мне объяснить недоразумение или что пошло не так.
При использовании Container.Register<IThirdPartyInterface>();
без реализации наш контейнер пытается зарегистрировать фабрику. При использовании SetInstance
без указания параметра типа общий выводится из аргумента и, таким образом, регистрируется в классе.
Вы можете либо зарегистрировать тип и интерфейс и позволить castle создать экземпляр с помощью Register<IThirdPartyInterface,ThirdPartyImplementation>()
, либо вы можете использовать SetInstance<IThirdPartyInterface>(thirdPartyImplementation)