Внедрение зависимости - выберите DLL и реализацию класса во время выполнения через файл конфигурации - PullRequest
2 голосов
/ 16 июня 2011

У меня есть API DLL ( API.dll , например), которая, в дополнение ко многим другим соображениям, делает доступным абстрактный класс ( AbstractClass ** 1008).

Теперь, используя это 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 Ответ

2 голосов
/ 16 июня 2011

Чтобы начать использовать 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,etc

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");
        }
    }
}
...