【问题标题】:Unit of Work Casting issue in Repository pattern存储库模式中的工作单元转换问题
【发布时间】:2014-03-21 06:33:33
【问题描述】:

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

“无法将'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
    { 
    }

知道我做错了什么吗?

【问题讨论】:

  • 你能显示你的 UserRepository 的代码吗?具体实现了哪些接口。
  • 恕我直言,这不是实现 UnitOfWork 模式的正确方法。您可以参考genericunitofworkandrepositories.codeplex.com 以获得更好的设计
  • @Senthil 感谢您的建议。我也一定会调查的
  • @ Euphoric 这是我的用户存储库类 public class UserRepository : Repository, IUserRepository { }
  • 我们需要知道您如何实例化实例。在这种情况下,您将创建新的 UserRepository 实例。

标签: c# asp.net-mvc generics repository-pattern


【解决方案1】:

这很简单。 authUnitOfWork.Repository&lt;User&gt;() 的实现返回没有实现IUserRepository,但仍实现IRepository&lt;User&gt; 的类的实例。只要实现了IRepository&lt;User&gt;,就没有什么可以阻止此方法返回IWhateverIWantRepository

您可以更改设计以强制执行此操作,也可以强制所有存储库实现I{SomeEntity}Repository 而不是IRepository&lt;SomeEntity&gt;。其中任何一个都非常复杂。

您的代码中的错误在于这些行:

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

这会创建Repository&lt;User&gt; 的实例,而不是UserRepository。运行时不知道您实际上想要一些相关的类,但与Repository&lt;T&gt; 不同。要修复它,您需要将UserRepository 类型传递给它或预先注册它。你不能指望运行时为你做这件事。

【讨论】:

    【解决方案2】:

    尝试下面的事情,你应该把用户作为 IRepository 我猜..

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

    【讨论】:

      猜你喜欢
      • 2019-01-06
      • 1970-01-01
      • 1970-01-01
      • 2016-05-10
      • 1970-01-01
      • 1970-01-01
      • 2014-12-27
      • 1970-01-01
      相关资源
      最近更新 更多