依赖注入-通过配置文件在运行时选择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和实现之外,我还需要指示该应用程序要使用的文件。我能在同一个文件中指明它的路径吗?
我只是需要一些技巧和指导来实现这样的事情。一些使用其中一个库的例子会很棒。
谢谢。
要开始使用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");
}
}
}