C#MVC存储库继承和常见的dataContext

时间:2011-07-19 10:36:30

标签: c# model-view-controller inheritance repository datacontext

说我有一个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.

这可能吗?

5 个答案:

答案 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)。