2

まず、私はこの記事を読んでいます。彼は、テストと概念実証のために、カスタムのインメモリ リポジトリを使用しています。RepositoryEntityStore. 次に、 new の使用を避けるために、彼はこれを実装しますが、これは記事には含まれていませんが、サンプルに含まれています。

namespace eDirectory.Naive.Repository
{
    /// <remarks>
    /// version 0.2 Chapter II: Repository
    /// </remarks>
    public class RepositoryLocatorEntityStore
        : RepositoryLocatorBase
    {
        protected Dictionary<Type, object> RepositoryMap = new Dictionary<Type, object>();

        public override IRepository<T> GetRepository<T>()
        {
            var type = typeof(T);
            if (RepositoryMap.Keys.Contains(type)) return RepositoryMap[type] as IRepository<T>;
            var repository = new RepositoryEntityStore<T>();
            RepositoryMap.Add(type, repository);
            return repository;
        }
    }
}

後で、彼はDIを使用してのインスタンスを作成しないと思います RepositoryEntityStore。問題は、拡張するクラスを操作するためにこれをどのように変更できるRepositoryEntityStoreかです。CustomerRepositoryEntityStore のように?

4

1 に答える 1

1

事前に正確なタイプがわからない場合 (または DI の一部として知りたくない場合) は、次のように使用できます。Activator.CreateInstance(typeof(T))

型がデフォルトのコンストラクターを提供していることを確認する必要がありますnew()

そのような柔軟性を提供するには、オブジェクトをインスタンス化するときに使用する依存関係を決定するためのマッピングまたはロジックを含むIoC (制御の反転) コンテナーを使用する必要があります。

これは、 ninjectなどの外部コンポーネントを介して実現できます。または、型とアセンブリ間のマッピングを生成する構成ファイルと同じくらい簡単にすることもできます。

Make次に、ジェネリック クラスを使用しているため、適切な (計算された) 型が必要になります。このコマンドはこれを処理します:MakeGenericType(type)

その後、この生成された型のインスタンスを作成できます。

したがって、コードは次のようになります。

namespace eDirectory.Naive.Repository
{
    /// <remarks>
    /// version 0.2 Chapter II: Repository
    /// </remarks>
    public class RepositoryLocatorEntityStore
        : RepositoryLocatorBase
    {
        protected Dictionary<Type, object> RepositoryMap = new Dictionary<Type, object>();

        public override IRepository<T> GetRepository<T>()
        {
            var type = typeof(T);
            if (RepositoryMap.Keys.Contains(type)) return RepositoryMap[type] as IRepository<T>;
            Type DIRepository = IoCContainer.getType()// get the right type from your mapping (IoC container)
            var repository = Activator.CreateInstance(DIRepository.MakeGenericType(type));
            RepositoryMap.Add(type, repository);
            return repository;
        }
    }
}
于 2012-10-23T18:07:06.087 に答える