Внедрение зависимости - выберите DLL и реализацию класса во время выполнения через файл конфигурации
У меня есть API DLL (например, API.dll), который, в дополнение ко многим другим соображениям, делает абстрактный класс (AbstractClass).
Теперь, используя этот абстрактный класс, я реализовал его на двух разных библиотеках:
- First.API.Implementation.dll с ConcreteImplementation1
- Second.API.Implementation.dll с ConcreteImplementation2
И ConcreteImplementation1, и ConcreteImplementation2 являются реализацией одного и того же абстрактного класса.
То, что я хочу, - это приложение, в котором я могу выбрать, какую из этих двух библиотек использовать, и, с помощью этого, выбрать, какую реализацию использовать без необходимости что-либо изменять в коде и, по возможности, без остановки приложения.
Какой-то конфигурационный файл, в котором я могу использовать приложение для любой реализации. Что-то вроде:
<appconfiguration>
<implementation_to_use>
<dll>First.API.Implementation.dll</dll>
<class>ConcreteImplementation1</class>
</implementation_to_use>
</appconfiguration>
Я почти ничего не знаю о внедрении зависимостей, кроме его концепции, но я думаю, это идеально подходит для этой задачи.
Я исследовал несколько библиотек DI / IoC, но я не знаком со всеми концепциями и именами. Я могу использовать любую библиотеку, какую захочу. Для того, что я могу сказать, они наиболее часто используются: StructureMap, Ninject и Sprint.NET
Более того, помимо всех библиотек и реализации, мне нужно указать файл, который будет использоваться этим приложением. Могу ли я указать его путь в том же файле?
Мне просто нужно несколько советов и указаний для реализации такой вещи. Некоторые примеры, использующие одну из этих библиотек, были бы потрясающими.
Благодарю.
1 ответ
Чтобы начать использовать StructureMap, создайте консольное приложение, включите в него:
structuremap.config:
<?xml version="1.0" encoding="utf-8" ?>
<StructureMap MementoStyle="Attribute">
<DefaultInstance
PluginType="DemoIoC.AbstractBase,DemoIoC"
PluggedType="DemoIoC.ConcreteImplementation1,DemoIoC"
Scope="Singleton" />
</StructureMap>
Атрибуты PluginType и PluggedType имеют значение "FullyQualifiedClassName,AssemblyName". По умолчанию он будет искать сборки в исполняемой папке, я не уверен, как вы указали бы другое расположение для сборок.
Есть много вариантов для Scope, например Singleton, Transient и т. Д.
Program.cs:
namespace DemoIoC
{
using System;
using StructureMap;
public static class Program
{
public static void Main(string[] args)
{
// here you initialize structuremap from the config file.
// You could probably use a FileSystemWatcher to reinitialize
// whenever the structuremap.config file changes
ObjectFactory.Initialize(x =>
{
x.UseDefaultStructureMapConfigFile = true;
});
var concrete = ObjectFactory.GetInstance<AbstractBase>();
concrete.Method1();
Console.ReadKey(true);
}
}
}
AbstractBase.cs:
namespace DemoIoC
{
public abstract class AbstractBase
{
public abstract void Method1();
}
}
ConcreteImplementation1.cs:
namespace DemoIoC
{
using System;
public class ConcreteImplementation1 : AbstractBase
{
public override void Method1()
{
Console.WriteLine("Called ConcreteImplementation1");
}
}
}