C# 存储库模式中的工作单元转换问题

C# 存储库模式中的工作单元转换问题,c#,asp.net-mvc,generics,repository-pattern,C#,Asp.net Mvc,Generics,Repository Pattern,更新:我正在尝试使用以下代码和存储库模式获取用户存储库。我正在获取运行时强制转换异常 “无法将'Bidstruct.Repository.Repository`1[Bidstruct.Entities.User]'类型的对象强制转换为此行的'Bidstruct.Repository.IUserRepository'” userRepo=(IUserRepository)authUnitOfWork.Repository() public class UserController : Co

更新:我正在尝试使用以下代码和存储库模式获取用户存储库。我正在获取运行时强制转换异常

“无法将'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
    { 
    }
公共类UserController:Controller
{
私有只读IUnitOfWork authUnitOfWork;
专用只读IUserRepository userRepo;
公共用户控制器(
[Dependency(“BidStructureAuthUnitOfWork”)]IUnitOfWork authUoW,
{
authUnitOfWork=authUoW;
userRepo=(IUserRepository)authUnitOfWork.Repository();
}
}
公共接口工作单元
{
i存储库(),其中T:class;
}
公共类UnitOfWork:IUnitOfWork
{
私有只读IDbContext _context;
私有哈希表存储库;
公共IRepository存储库(),其中T:class
{
如果(_==null)
_repositories=newhashtable();
var type=typeof(T).名称;
if(!\u repositories.ContainsKey(类型))
{
var repositoryType=typeof(存储库);
var repositoryInstance=
Activator.CreateInstance(repositoryType
.MakeGenericType(typeof(T)),_context);
_Add(类型,repositoryInstance);
}
返回(IRepository)_存储库[类型];
}
}
//用户存储库界面
公共接口IUserRepository:IRepository
{
}
公共类UserRepository:存储库,IUserRepository
{ 
}

知道我做错了什么吗?

试试下面的东西,我想你应该把用户作为我的推荐人

private readonly IRepository<User> userRepo;
private readonly IRepository<User> roleRepo;
私有只读IRepository userRepo;
私人只读易读角色;

这很简单。
authUnitOfWork.Repository()的实现
返回类的实例,该类未实现
IUserRepository
,但仍实现
IRepository
。只要实现
IRepository
,就没有任何东西可以阻止此方法返回
iWhaterIwantRepository

您可以更改您的设计,使其强制执行,或者强制所有存储库实现
I{SomeEntity}Repository
,而不是
IRepository
。这两者都非常复杂

代码中的错误出现在以下行:

var repositoryType = typeof (Repository<>);
var repositoryInstance = Activator.CreateInstance(repositoryType.MakeGenericType(typeof (T)), _context);
var repositoryType=typeof(存储库);
var repositoryInstance=Activator.CreateInstance(repositoryType.MakeGenericType(typeof(T)),_context);

这将创建
Repository
的实例,而不是
UserRepository
。运行时不知道您实际上想要某个与
Repository
相关但不同的类。要修复它,您需要将
UserRepository
类型传递给它,或者事先注册它。您不能期望运行时为您完成此操作.

你能展示你的用户存储库的代码吗?具体地说,它实现了什么接口。这不是实现UnitOfWork模式的正确方法。你可以参考更好的设计@Senthil谢谢你的建议。我肯定也会研究这个@Euphoric这是我的用户存储库类公共类的用法rRepository:Repository,IUserRepository{}我们需要知道如何实例化实例。在本例中,创建新的UserRepository实例。