C # MVC наследование репозитория и общий dataContext - PullRequest
0 голосов
/ 19 июля 2011

Допустим, у меня есть 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();
}

Теперь можно ли использовать общий текстовый текст, который применяется ко всем репозиториям?Так что, когда я сохраню с gr.Save(), он будет применяться к cr?Я имею в виду:

//Instead of  
cr.Save();
gr.Save();

//I want
gr.Save(); // And my category will also be saved.

Возможно ли это?

Ответы [ 5 ]

0 голосов
/ 19 июля 2011

Вы должны добавить еще один уровень абстракции для концепции 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. Вы можете использовать свой код для любого текста данных (даже NHibernate ).

0 голосов
/ 19 июля 2011

Для этих целей вы можете использовать шаблон Единица работы .

0 голосов
/ 19 июля 2011

IGenericRepository содержит ваш метод сохранения?

public class IGenericRepository 
{
     save{};
}
0 голосов
/ 19 июля 2011

В данном случае, учитывая, что CategoryRepository наследуется от GenericRepository, почему бы просто не использовать CategoryRepository как для вызовов, так и для одного и того же контекста.Однако лучший подход - внедрить ваш контекст через контейнер DI и использовать LifetimeManager вашего контейнера, чтобы гарантировать, что тот же контекст доступен для всего HttpRequest.

Если вы используете Unity от Microsoft, я написалсообщение в блоге об этом здесь

0 голосов
/ 19 июля 2011

Можете ли вы сделать что-то подобное?(передать ваш производный репозиторий универсальному)

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();
    }         
}
...