0

我正在关注Repository Pattern与模式相结合的教程Unit Of Work

我基本上有:

interface IRepository<T> where T : class
{
  //...
}
class Repository<T> where T : class
{
  //Implemented methods 
}
interface IFooRepository
{
  IQueryable<Foo> GetFoos();
}
class FooRepository : Repository<Foo>, IFooRepository
{
  IQueryable<Foo> GetFoos() {}
}

以上代表我的repositories,在基本意义上。然后我有Uow课。

public class MyUow
{
  public void Commit() { }
  public IRepository<Bar> Bars { get { return GetStandardRepo<Bar>(); } }
  public IFooRepository Foos { get { return GetRepo<IFooRepository>(); } }
  private IRepository<T> GetStandardRepo()
  {
    return RepositoryProvider.GetRepoistoryForEntityType<T>();
  }
  private T GetRepo<T>()
  {
    return RepositoryProvider.GetRepository<T>();
  }
}

我的问题来了,我正在关注的教程只Dictionairy<Type, object>RepositoryProvider课堂上实例化 a 并且似乎没有填充它,所以使用的方法GetRepo<T>不起作用。

public virtual T GetRepository<T>(Func<DbContext, object> factory = null) where T : class
{
  //Look for T in the dictionairy by typeof(T)
  object repoObj;
  Repositories.TryGetValue(typeof(T), out repoObj);
  if (repoObj != null)
    return (T)repoObj;
  //Not found or a null value, make a new instance of the repository.
  return MakeRepository<T>(factory, Context);
}
private T MakeRepository<T>(Func<DbContext, object> factory, DbContext dbContext) where T : class
{
  var f = factory ?? _repositoryFactories.GetRepositoryFactory<T>();
  if (f == null)
    //Exception here because this is null
    throw new NotImplementedException("No factory for repository type");
  var repo = (T)f(dbContext);
  Repositories[typeof(T)] = repo;
  return repo;
}

我的问题本质上是实现这种模式的正确方法是什么以及我哪里出错了?我应该Dictionairy<Type, Func<DbContext, object>用已知存储库的列表来实例化吗?这看起来很脏。我正在疯狂地试图解决这个问题!

提前致谢。

4

3 回答 3

0

如果您还没有找到答案,我会按照教程进行操作并且能够运行它(教程示例)。如果您确定您已正确实施,请注意这一点,

默认情况下,存储库字典为 null,并且仅在首次请求时才具有非标准存储库(例如 IFooRepository)的值。因此,如果您正在检查存储库字典的调试中的值并且尚未请求 IFooRepository,那么您肯定不会在那里看到它。首先有一个访问 IFooRepository 的代码,然后它将在提供程序类的 MakeRepository 方法中为其创建一个存储库。

希望有帮助

于 2013-08-28T11:14:13.460 回答
0

我从一开始就看到你Repository<T>没有实现IRepository<T>,所以应该是这样的:

class Repository<T> : IRepository<T> where T : class
{
  //Implemented methods 
}

然后你完全秘密的教程应该描述如何_repositoryFactories.GetRepositoryFactory<T>()发现你的IRepository<T>实现者FooRepository——也许它会是自动发现的,也许你需要在某个地方注册一些东西。

接下来,我对你的具体教程和工厂等一无所知,但我想你可能需要使用GetRepo<Foo>代替GetRepo<IFooRepository>,因为现在这IFooRepository看起来毫无意义......或者你可能再次错过了这个IFooRepository声明中的一些东西,它应该像interface IFooRepository : IRepository<Foo>-同样,它在很大程度上取决于您正在使用的工厂的特定发现实现。

于 2013-03-26T16:55:09.960 回答
0

有一个名为RepositoryFactories.cs 您需要为您的自定义存储库添加一个条目到字典的帮助程序类

{typeof(IFooRepository ), dbContext => new FooRepository (dbContext)}
于 2016-03-17T16:35:37.883 回答