Как я могу использовать внедрение зависимостей для свойства плагина, когда тип и экземпляр свойства являются частью стороннего пакета?

#.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)