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は基本的な意味での my を表しています。その後、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>内でa をインスタンス化するだけRepositoryProviderで、それを埋めていないように見えるため、使用されているメソッドが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

というヘルパー クラスがありRepositoryFactories.cs ます。カスタム リポジトリのエントリをディクショナリに追加する必要があります。

{typeof(IFooRepository ), dbContext => new FooRepository (dbContext)}
于 2016-03-17T16:35:37.883 に答える
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>IFooRepositoryIFooRepositoryinterface IFooRepository : IRepository<Foo>

于 2013-03-26T16:55:09.960 に答える
0

まだ答えが見つからない場合は、チュートリアルに従って、実行することができました (チュートリアル サンプル)。正しく実装したと確信している場合は、これに注意してください。

リポジトリ ディクショナリはデフォルトで null であり、最初に要求されたときに非標準リポジトリ (IFooRepository など) の値のみを持ちます。したがって、リポジトリ ディクショナリのデバッグで値をチェックしていて、IFooRepository がまだ要求されていない場合、そこに値が表示されないことは確実です。最初に IFooRepository にアクセスするコードを用意してから、プロバイダー クラスの MakeRepository メソッドでそのリポジトリを作成します。

それが役立つことを願っています

于 2013-08-28T11:14:13.460 に答える