说我有一个GenericRepository:
public class IGenericRepository
{
// bla bla bla
}
public class GenericRepository : IGenericRepository
{
public myDataContext dc = new myDataContext();
// bla bla bla
}
我有一个特定的类别存储库:
public class CategoryRepository : GenericRepository
{
// bla bla bla
}
并在我的控制器中:
public ActionResult something()
{
CategoryRepository cr = new CategoryRepository();
GenericRepository gr = new GenericRepository();
Category cat = cr.GetMostUsedCategory();
SubCategory sub = gr.GetById(15);
// And after I make some changes on these two entities I have to:
cr.Save();
gr.Save();
}
现在,是否可以使用适用于所有存储库的通用datacontext?因此,当我从gr.Save()
保存时,它会申请cr
?我的意思是:
//Instead of
cr.Save();
gr.Save();
//I want
gr.Save(); // And my category will also be saved.
这可能吗?
答案 0 :(得分:0)
public class IGenericRepository
{
void Save();
}
public class GenericRepository : IGenericRepository
{
public myDataContext dc = new myDataContext();
private _IGenericRepository = null;
// bla bla bla
public GenericRepository(IGenericRepository repository)
{
_IGenericRepository = repository;
}
void Save()
{
_IGenericRepository.Save();
}
}
答案 1 :(得分:0)
IGenericRepository包含您的保存方法吗?
public class IGenericRepository
{
save{};
}
答案 2 :(得分:0)
在这种情况下,鉴于CategoryRepository继承自GenericRepository,为什么不仅仅使用CategoryRepository进行两次调用,而是使用相同的上下文。但是,最好的方法是通过DI容器注入上下文,并使用容器的LifetimeManager来确保整个HttpRequest可以使用相同的上下文。
如果你碰巧使用微软的Unity,我写了一篇关于它的博客文章here
答案 3 :(得分:0)
您可以将Unit Of work模式用于这些目的。
答案 4 :(得分:0)
您应该为DataContext概念添加一个抽象层:
//It is the generic datacontext
public interface IDataContext
{
void Save();
}
//It is an implementation of the datacontext. You will
//have one of this class per datacontext
public class MyDataContext:IDataContext
{
private DataContext _datacontext;
public MyDataContext(DataContext dataContext)
{
_datacontext = dataContext;
}
public void Save()
{
_datacontext.Save();
}
}
然后在您的存储库中:
public class GenericRepository<TDataContext> : IGenericRepository where TDataContext: IDataContext,new()
{
public TDataContext dc = new TDataContext();
// bla bla bla
}
public class CategoryRepository:GenericRepository<MyDataContext>
{
// bla bla bla
public void SaveSomething()
{
dc.Save();
}
}
当然,这只是一种方法:-)你可以改进它,但重点是Datacontext的概念。您可以将代码用于任何datacontext(甚至是NHibernate)。