更新:我正在尝试使用以下代码和存储库模式来获取用户存储库。我得到了运行时转换异常
"无法转换类型为' Bidstruct.Repository.Repository`1 [Bidstruct.Entities.User]'输入' Bidstruct.Repository.IUserRepository'"在这一行
userRepo =(IUserRepository)authUnitOfWork.Repository();
public class UserController : Controller
{
private readonly IUnitOfWork authUnitOfWork;
private readonly IUserRepository userRepo;
public UserController(
[Dependency("BidstructAuthUnitOfWork")] IUnitOfWork authUoW,
{
authUnitOfWork = authUoW;
userRepo = (IUserRepository)authUnitOfWork.Repository<User>();
}
}
public interface IUnitOfWork
{
IRepository<T> Repository<T>() where T : class;
}
public class UnitOfWork : IUnitOfWork
{
private readonly IDbContext _context;
private Hashtable _repositories;
public IRepository<T> Repository<T>() where T : class
{
if (_repositories == null)
_repositories = new Hashtable();
var type = typeof (T).Name;
if (!_repositories.ContainsKey(type))
{
var repositoryType = typeof (Repository<>);
var repositoryInstance =
Activator.CreateInstance(repositoryType
.MakeGenericType(typeof (T)), _context);
_repositories.Add(type, repositoryInstance);
}
return (IRepository<T>) _repositories[type];
}
}
// User Repository Interface
public interface IUserRepository : IRepository<User>
{
}
public class UserRepository : Repository<User>, IUserRepository
{
}
知道我做错了吗?
答案 0 :(得分:2)
这很简单。 authUnitOfWork.Repository<User>()
的实现返回未实现IUserRepository
但仍实现IRepository<User>
的类的实例。只要它实现IWhateverIWantRepository
,就没有任何东西可以阻止此方法返回IRepository<User>
。
您可以更改设计,以便强制执行或强制所有存储库实现I{SomeEntity}Repository
而不是IRepository<SomeEntity>
。其中任何一个都会非常复杂。
您的代码出现错误:
var repositoryType = typeof (Repository<>);
var repositoryInstance = Activator.CreateInstance(repositoryType.MakeGenericType(typeof (T)), _context);
这会创建Repository<User>
而非UserRepository
的实例。运行时不知道您实际上想要一些相关的类,但与Repository<T>
不同。要修复它,您需要将UserRepository
类型传递给它或预先注册它。你不能指望运行时为你做这件事。
答案 1 :(得分:0)
尝试下面的事情你应该把用户作为IRepository我猜..
private readonly IRepository<User> userRepo;
private readonly IRepository<User> roleRepo;