【发布时间】:2011-05-31 22:20:25
【问题描述】:
这是我从抽象基类派生的具体存储库
public class DepartmentRepository : RepositoryBase<Department>, IDepartmentRepository
public abstract class RepositoryBase<T> : IRepository<T> where T : class, IPersistantBusinessObject
这是我的界面
public interface IDepartmentRepository : IRepository<Department>
public interface IRepository<T> where T : IPersistantBusinessObject
public interface IPersistantBusinessObject { ... }
这是我的实体
public class Department : BusinessObjectBase
public abstract class BusinessObjectBase : IPersistantBusinessObject
如何将我的 DepartmentRepository 转换为通用 IRepository?
DepartmentRepository rep = new DepartmentRepository();
(IRepository<IPersistentBusinessObject>)rep; // this doesn't work
想法?如果您想知道,这是一个使用存储库模式的 asp.net MVC3 应用程序。我是否过度设计了接口?我现在应该如何使用通用存储库?
谢谢。
编辑: 这是我的 IRepository 界面。当被问及为什么我需要强制转换为 IRepository 时,实际上只是为了我可以使用“SaveChanges”方法,因为我想拦截数据库中的任何异常并以通用方式处理。
public interface IRepository<T> where T: IPersistantBusinessObject
{
IQueryable<T> Retrieve();
T Retrieve(int id);
IQueryable<T> RetrieveActiveAndInActive();
T RetrieveActiveAndInActive(int id);
void Add(T domainObject);
void SaveChanges();
void Delete(T domainObject);
void Delete(int id)
}
【问题讨论】:
-
“这不起作用”是什么意思? 确切的错误信息是什么?
-
回答“我是否过度设计了接口”:是的。我不确定你从这个奇怪的继承/实现图中获得了什么。另外,如果您已经将其作为
DepartmentRepository,为什么要直接将其转换为该接口? -
@Jim - 我得到一个 InvalidCastException。
标签: c# generics interface casting