10

汎用インターフェースと汎用実装があるとします。すべての使用状況を登録するにはどうすればよいですか?

具体的には、次のものがあります(簡単にするために縮小しています):

public interface IRepository<T> where T : TableEntity
{
    T GetById(string partitionKey, string rowKey);
    void Insert(T entity);
    void Update(T entity);
    void Update(string partitionKey, string rowKey, Action<T> updateAction);
    void Delete(T entity);
    IQueryable<T> Table { get; }
}


public class AzureRepository<T> : IRepository<T> where T : TableEntity
{
    ...
}

次のように、すべての実装を 1 つずつ登録する必要がありますか。

container.Register<IRepository<Entity1>, AzureRepository<Entity1>>();
container.Register<IRepository<Entity2>, AzureRepository<Entity2>>();
container.Register<IRepository<Entity3>, AzureRepository<Entity3>>();
...

それとももっと短い方法がありますか?

4

1 に答える 1

11

私のコメントで述べたように、TinyIoC には Open Generics の解決にバグがあります。異なる型パラメーターを持つ解決されたインスタンスを別々に保持しません。すべての登録は.AsSingleton()デフォルトで暗黙的に行われるため、常に最初のインスタンスを返します後続のすべての解決要求で解決されたジェネリック型。

このため、以下は機能しません。

container.Register(typeof(IRepository<>), typeof(AzureRepository<>));

ただし、回避策があります。登録を一時的にします。

container.Register(typeof(IRepository<>), typeof(AzureRepository<>)).AsMultiInstance();

これにより、解決要求ごとに新しいインスタンスが作成され、型パラメーターが適切に尊重されます。これの欠点は、以前に解決された型パラメーターを使用してインターフェイスを要求するたびに、新しいインスタンスも取得することです。

編集

確認済み。Open Generics の解決ではSingletonFactory、インスタンスが作成されると、以降の解決で常にそれが返されることを使用します。ジェネリックについては知りませんし、気にもしません。これが適切に機能するGenericSingletonFactoryためには、単一のインスタンスを保持するだけでなく、解決する具象型によってキー付けされた辞書を保持する が必要です。

わかりました、それを修正するのはそれほど難しくありませんでした。それが本当にすべて正しいことを確認するには、まだ十分に理解していません。

于 2013-03-30T01:51:18.347 に答える