2

ASP.NET MVC アプリケーションに、すべての汎用リポジトリが参照されるインターフェイス/クラスがあります。これは次のようになります。

public interface IDb
{
    IGenericRepository<Car> CarRepository { get; }
    ...
    IGenericRepository<User> UserRepository { get; }
}

私の目標は、特定のインターフェイスを実装するアセンブリ内のすべての型を見つけてから、対応する汎用リポジトリを見つけて、データベースからいくつかのオブジェクトを取得することです。これはうまくいくはずです:

List<IVehicle> vehicleElements = new List<IVehicle>();

Type vehicleType = typeof(IVehicle);
Type dbType = typeof(IDb);
foreach (Type type in vehicleType.Assembly.GetTypes().Where(t => t.IsClass && t.GetInterfaces().Contains(vehicleType)))
    {
        PropertyInfo repositoryInfo = dbType.GetProperties().Where(p => p.PropertyType.GenericTypeArguments.Contains(type)).SingleOrDefault();
        if (repositoryInfo != null)
        {
            var repository = repositoryInfo.GetValue(this.db);
            // TODO: work with repository
        }
    }

return vehicleElements;

私の問題は、リポジトリ変数を必要な汎用 IGenericRepository にキャストする方法がわからないことです...何かアイデアはありますか?

4

2 に答える 2

0

このコードで対話する必要がある一般的なメソッドを備えた基本 IRepository インターフェイスを使用します。

何らかの理由でそれが不可能な場合は、動的にキャストするか、リフレクションを介して必要なメソッドを取得することにより、疎結合アプローチを使用できます。

于 2013-04-17T15:03:06.953 に答える
0

強力な型付きリポジトリを作成するには、コンパイル時にインターフェイスを実装する型を知る必要があるため、やりたいことがうまくいきません。しかし、それは実行時にしかわかりません。

1 つの解決策は、非汎用リポジトリを導入することです。

別の解決策は、dynamicキーワードを使用することです。

dynamic repository = repositoryInfo.GetValue(this.db);
repository.SomeMethod(...);

ただし、これは、コンパイラがこの動的変数を含むコードをチェックできなくなったことを意味します。言い換えれば、実行時例外SomeMethodの実際の型に存在しない場合、コンパイラ エラーの代わりにスローされます。repository

于 2013-04-17T15:01:02.863 に答える