【发布时间】:2012-10-03 14:55:58
【问题描述】:
我知道如何在 c# 中制作可插入的东西。定义一个接口,Activator.CreateInstance(<class>) 等。或者我可以有一个明确创建插入类实例的代码路径。方法很多。
但是,如果我想要使可插拔的服务是静态的(我知道我可以重构它不是,但这不是问题的重点)
具体例子。我有一个提供磁盘 I/O 抽象的类(读取文件、列表目录……)。现在我想要这个抽象的不同实现,它提供来自真实 FS、数据库的文件。
根据 Olivier Jacot-Descombes 的回复,我将有一个像这样的 FileSystem 类(这是真实的)
public static class FileSystem
{
static IFSImplemenation s_imple;
static FileSystem()
{
if(<some system setting>)
// converted to singleton instead of static
s_imple = new OldFileSystem()
else
s_imple = new DbFileSystem();
}
public static byte[] ReadFile(string path)
{
return s_imple.ReadFile(path);
}
...
}
重申一下 - 我有大量代码不想更改,因此保持调用签名相同很重要 - 此解决方案实现了这一点
【问题讨论】:
-
如果你想要抽象和按合同设计等,那么你想要使用实例而不是静态方法。您知道这并不能改变这样一个事实,即为此目的使用
static构造是完全错误的方法。 -
你真的,真的想看看依赖注入;您获得了换出实现的能力,但这并不容易,很可能需要重新编译使用者(依赖注入不需要重新编译)并且根本不可测试。
-
@casperOne 我认为我们基于实例化类的所有 DI 系统
-
是的,但是 DI 实现会为您进行实例化,通常通过即时编译的代码或反射(通常是前者)基于模式(找到接口和具体之间的映射)类型)。如果你的类都在库中并使用契约,契约不会改变,库也不需要重新编译,只需要在你设置 DI 的地方。其他一切都保持不变。
标签: c# .net plugins static-classes