依赖注入-通过配置文件在运行时选择DLL和类实现

本文关键字:DLL 选择 实现 运行时 注入 -通 配置文件 依赖 | 更新日期: 2023-09-27 17:59:27

我有一个API DLL(例如,API.DLL),除了许多其他想法之外,它还提供了一个抽象类(AbstractClass)。

现在,利用AbstractClass,我在两个不同的dll上实现了它:

  • 第一.API.Implementation.dll 带有混凝土实施1
  • Second.API.Elementation.dll 带有混凝土实施2

ConcreteImplementation1和ConcreteIamplementation2都是同一抽象类的实现

我想要的是一个应用程序,在这个应用程序中,我可以选择使用这两个dll中的哪一个,并通过它选择使用哪个实现,而无需用户更改代码中的任何内容,如果可能,也无需停止应用程序。

一些配置文件,我可以让应用程序使用我想要的任何实现。类似于:

<appconfiguration>
    <implementation_to_use>
        <dll>First.API.Implementation.dll</dll>
        <class>ConcreteImplementation1</class>
    </implementation_to_use>
</appconfiguration>

除了依赖注入的概念外,我对它几乎一无所知,但我想这非常适合这项任务。

我研究了几个DI/IoC库,但我并不熟悉所有的概念和名称。我可以使用我想要的任何图书馆。我可以说,这些是最常用的:StructureMap、Ninject和Sprint.NET

此外,除了所有的dll和实现之外,我还需要指示该应用程序要使用的文件。我能在同一个文件中指明它的路径吗?

我只是需要一些技巧和指导来实现这样的事情。一些使用其中一个库的例子会很棒。

谢谢。

依赖注入-通过配置文件在运行时选择DLL和类实现

要开始使用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等

程序.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();
    }
}

混凝土实施1.cs:

namespace DemoIoC
{
    using System;
    public class ConcreteImplementation1 : AbstractBase
    {
        public override void Method1()
        {
            Console.WriteLine("Called ConcreteImplementation1");
        }
    }
}