パターン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>
既知のリポジトリのリストでをインスタンス化する必要がありますか? これは汚れているようです。私はこれを解決しようとして気が狂っています!
前もって感謝します。