1

私はインターフェースを持っています:

public interface IHHSDBUtils
{
    void SetupDB();

    bool TableExists(string tableName);
    . . .

...複数の実装者がいます:

public class SQLiteHHSDBUtils : IHHSDBUtils
public class SQCEHHSDBUtils : IHHSDBUtils
public class FlatfileHHSDBUtils : IHHSDBUtils
public class TestHHSDBUtils : IHHSDBUtils

次のように、グローバルにアクセス可能な場所から使用する実装者を指定できるようにしたいと考えています。

public static class HHSConsts
{
    public static IHHSDBUtils hhsdbutil = SQLiteHHSDBUtils;

...そして、アプリのどこからでも次のように呼び出します。

private HHSDBUtils hhsdbutils { get; set; }
. . .
hhsdbutils = new HHSConsts.hhsdbutil;
hhsdbutils.SetupDB();

これは可能ですか?「「SQLiteHHSDBUtils」は「タイプ」ですが、上記の hhsdbutil への割り当てにより「変数」のように使用されます。

4

1 に答える 1

2

タイプごとに列挙型を作成し、タイプを作成する静的ファクトリ メソッドを作成することで、poormans Factory の実装を行うことができます。現在のコード スニペットにできる限り近づけます。

public enum HHSDBUtilsTypes 
{
    Sqllite,
    SQCE,
    Flatfile,
    Test
}

public static class HHSConsts
{
    private const string implementation = HHSDBUtilsTypes.Sqllite; // you might read this from the config file

    public static IHHSDBUtils GetUtils()
    {
         IHHSDBUtils impl;
         switch(implementation)
         {
            case HHSDBUtilsTypes.Sqllite:
               impl = new SQLiteHHSDBUtils();
            break;
            case HHSDBUtilsTypes.SQCE:
               impl = new SQCEHHSDBUtils();
            break;
            case HHSDBUtilsTypes.Sqllite:
               impl = new FlatfileHHSDBUtils();
            break;
            default:
               impl = new TestHHSDBUtils();
            break;
         }
         return impl;
    }
}

そして、次のように使用します。

private IHHSDBUtils hhsdbutils { get; set; }
//. . .
hhsdbutils = HHSConsts.GetUtils();
hhsdbutils.SetupDB();

別のオプションは、Activator.CreateInstanceを使用することです。

 const string fulltypename = "Your.Namespace.SQLiteHHSDBUtils"; // or read from config;
 hhsdbutils = (HHSDBUtils) Activator.CreateInstance(null, fulltypename).Unwrap();

特に、これらの方法のいずれかを使用して多くの型を頻繁にインスタンス化する必要がある場合は、必ずパフォーマンスをテストして測定してください。

さらに制御が必要な場合は、次のような依存性注入/制御の反転フレームワークを使用します。

ただし、これらのフレームワークはすべて独自の強力な機能を備えているだけでなく、複雑さも増していることに注意してください。フレームワークを選択する必要があると思われる場合は、保守性と学習性を主要な要件としてください。

ここにDIに関する追加のドキュメントがあります

于 2014-12-01T21:20:55.150 に答える