存储库模式中的工作单元铸造问题

本文关键字:单元 问题 工作 模式 存储 | 更新日期: 2023-09-27 17:51:08

Updated:我正试图使用以下带有存储库模式的代码获得用户存储库。我得到运行时强制转换异常

"无法强制转换类型为'Bidstruct.Repository.Repository '的对象。输入"Bidstruct.Repository"。

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
    { 
    }

你知道我做错了什么吗?

存储库模式中的工作单元铸造问题

这很简单。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类型或事先注册它。

试试下面的东西,我猜你应该把用户作为IRepository .

private readonly IRepository<User> userRepo;
private readonly IRepository<User> roleRepo;