0

私は現在、数年前の既存のアプリケーションをリファクタリングして、依存性注入 (私は初めてです) を使用して、使用したい同期プロバイダーを注入できるようにしています。

私が取り組んでいるクラスには複数のコンストラクターがあるため、インターフェイスとファクトリをセットアップする方法を見つけるのに苦労しています。

できる限りこれをレイアウトしてみます。すべて使用される 4 つのコンストラクターを持つアプリケーションの複数の部分を介してアクセスされる Sync クラスがあります

同期.cs

public class Sync : ISync
{
    private static Hashtable _locks = new Hashtable();

    private CSettings _cs = null;
    private RemovedCallback _callback = null;
    protected object _cObject = null;
    protected bool _isLocked = false;
    private DateTime _expires = DateTime.MinValue;

    public Sync() { }

    public Sync(CSettings cs) : this(cs, null) { }

    public Sync(CSettings cs, RemovedCallback callback)
    {
        Callback = callback;
        Settings = cs;
    }

    public Sync(string key)
    {
        Settings = new CSettings();

        Settings.Key = key;
    }

    public object Object
    {
        get { return Get(); }
        set { Set(value); }
    }

    public void Get()
    { 
    }

    public void Set()
    {
    }

    //other methods, some that reference Remove and Set
}

ISync.cs

public interface ICacheSync : IDisposable
{
    object Get();

    void Set(object obj);
}

SyncProvider.cs

public class SyncProvider : ISync
{
    public override object Get()
    {
         //some code
    }

    public override void Set(object obj)
    {
        //some code
    }
}

Syncクラスでは、挿入する Sync プロバイダーごとにGetメソッドと Set メソッドが異なりますSync クラスの残りの部分は同じままにする必要があります。

私の最終的な目標は、 GetSetをさまざまな方法で使用するさまざまな同期プロバイダーを挿入できるようにすることです。

現在、Sync クラスは、このプロジェクト全体で次の方法で参照されています。

例 1

using (Sync sync = new Sync(CSettings, ItemRemoved))
{
    //some code
}

例 2

using (Sync sync = new Sync(CSettings))
{
     sync.Remove();
}

例 3

using (Sync sync = new Sync(string))
{
    sync.Remove();
}

私はNinjectを使用しており、インターフェイスを作成して注入する方法を試しましたが、オブジェクトエラーのインスタンスに設定されていないオブジェクト参照が常に発生するため、うまくいかないようです。

これを行う方法に関するヘルプやガイダンスは、DI をより理解するのに非常に役立ちます。

4

1 に答える 1

1

この場合、依存性注入ではなく、ファクトリを使用することをお勧めします。

ファクトリ自体は、現在 Sync インスタンスを構築しているクラスに注入できますが、Sync オブジェクトを直接「新規作成」する代わりに、それを SyncFactory に委譲します。

using (Sync sync = this.syncFactory.Create(CSettings, ItemRemoved))
{
    //some code
}

using (Sync sync = this.syncFactory.Create(CSettings))
{
    //some code
}

using (Sync sync = this.syncFactory.Create(stringValue)
{
    sync.Remove();
}
于 2012-11-15T11:59:12.227 に答える