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);
}
...
}
繰り返しますが、変更したくない大量のコードがあるため、呼び出し元の署名を同じに保つことが重要でした。このソリューションはそれを実現します。