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

你想做的事情是行不通的,因为为了拥有一个强大的类型存储库,你需要在编译时知道实现你的接口的类型。但是你只在运行时知道它。

一种解决方案是引入非通用存储库。

另一种解决方案是使用dynamic关键字。

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

但是,这意味着编译器不再可以检查涉及此动态变量的代码。换句话说:如果SomeMethod实际类型不存在,repository则将抛出运行时异常而不是编译器错误。

于 2013-04-17T15:01:02.863 回答
0

我会使用一个基本的 IRepository 接口,其中包含您需要在此代码中与之交互的常用方法。

如果由于某种原因这不可能,您可以通过强制转换为动态或通过反射获取所需的方法来采用松散耦合的方法。

于 2013-04-17T15:03:06.953 回答