0

私のコードでは、このような繰り返しのアクションがたくさんあります。このオブジェクトの登録リポジトリのこのプロセスを 1 つの基本クラスで自動化するために、1 つのジェネリック メソッド (リフレクションを使用) を記述したいと考えています。

        _container.RegisterType(typeof(IFinanceRepository<User, int>), typeof(UsersRepository), new TransientLifetimeManager(), new InjectionMember[] { });
        _container.RegisterType(typeof(IFinanceRepository<News, int>), typeof(NewsRepository), new TransientLifetimeManager(), new InjectionMember[] { });
        _container.RegisterType(typeof(IFinanceRepository<Currency, int>), typeof(CurrenciesRepository), new TransientLifetimeManager(), new InjectionMember[] { });
        _container.RegisterType(typeof(IFinanceRepository<Language, int>), typeof(LanguagesRepository), new TransientLifetimeManager(), new InjectionMember[] { });

public class UsersRepository : EFFinanceRepository<User, int>

すべてのオブジェクト (Users、News などには基本インターフェイスがあります - IObject そこに T - ID プロパティの型 (Guid、int など) です)

 public class User : IObject<int>
{
    /// <summary>
    /// every object ID
    /// </summary>
    public int ID { get; set; }

すべてのリポジトリには基本クラスがあります

IOvolimeFinanceRepository<T, in IDType>

T - IObject (ユーザー、ニュース) IDType - 各オブジェクトの ID プロパティのタイプ i

助けてください、これを自動化する完全な抽象ジェネリックメソッドを生成してください!

4

3 に答える 3

1

コンベンションベースの登録を追加するUnity拡張機能の使用を検討することをお勧めします。そこにいくつかあります。私はそれらのどれも使用していませんが、Castle Windsorでのコンベンションベースの登録を使用しており、絶対に気に入っています。

于 2013-03-06T16:43:00.907 に答える
0

Unity には、Registration by Convention がすでに付属しています。

ターゲットにしているバージョンについては言及していません。これはUnity 3.0以降で利用できると確信しています

http://msdn.microsoft.com/en-us/library/dn507479%28v=pandp.30%29.aspx

于 2014-12-30T05:51:05.610 に答える
0

リポジトリのメイン インターフェイス (IOvolimeFinanceRepository) 用のシンプルなインターフェイスを追加する必要があります - IGenericRepository

var types = Assembly.GetExecutingAssembly().GetTypes();

        var concreteRepositoryTypes = (from t in types
                                       where !t.IsAbstract && typeof(IGenericRepository).IsAssignableFrom(t)
                                       select t).ToList();

        foreach (var repositoryType in concreteRepositoryTypes)
        {
            //register like _container.RegisterType(typeof(UsersRepository), typeof(UsersRepository), new TransientLifetimeManager(), new InjectionMember[] { });
            _container.RegisterType(repositoryType, new TransientLifetimeManager(), new InjectionMember[] { });

            var interfaceForRepository = repositoryType.GetInterfaces().FirstOrDefault(x => x != typeof(IGenericRepository));

            if(interfaceForRepository != null)
                _container.RegisterType(interfaceForRepository, repositoryType, new TransientLifetimeManager(), new InjectionMember[] { });
        }
    }
于 2013-03-06T16:24:43.323 に答える