Структура объекта DbContext в режиме wcf для каждого вызова - PullRequest
4 голосов
/ 14 февраля 2011

У меня есть такой репозиторий

public abstract class BaseRepository<TEntity> : IRepository<TEntity> where TEntity : class
{
    protected DbContext _dbContext;

    public BaseRepository(DbContext dbContext)
    {
        _dbContext = dbContext;
    }

    public TEntity GetByKey(object keyValue)
    {
        // todo
    }
}

и конкретное хранилище вроде этого

public CustomerRepository : BaseRepository<Customer> , ICustomerRepository
{
     public CustomerRepository(DbContext context) : base (context) { }

     public Customer FindCustomerByKey(string key)
     {
          _dbContext.Set<Customer>().Find(key);
     }

}

У меня есть такой сервис wcf

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class CustomerSatisfactionService : ICustomerSatisfactionService
{
    private ICustomerRepository _customerRepository;
    private IHelpDeskRepository _helpdeskRepository;


    public AccountService(ICustomerRepository customerRepository,IHelpdeskRepository  helpdeskRepository)
    {
        _customerRepository = customerRepository;
        _helpdeskRepository = helpdeskRepository;
    }

    public void DoSomethingUsingBothRepositories()
    {
         //   start unit of work
         // _customerRepository.DoSomething();
         // _helpdeskRepository.DoSomething();
         // commit unit of work
    }


 }

и я использую StructureMap для внедрения таких экземпляров DbContext, как этот

For<DbContext>().Use(() => new MyApplicationContext());

Моя проблема в том, что когда клиент вызывает службу, создается новый экземпляр CustomerSatisfactionService, следовательно, создаются новые экземпляры CustomerRepository и HelpdeskRepository, но с разными DbContexts.

Я хочу реализовать шаблон единицы работы, но в методе DoSomethingWithBothRepositories два хранилища имеют разные DbContexts.

Есть ли какой-нибудь способ указать структуре карты ускорить работу экземпляра DbContext для каждого вызова?

Ответы [ 3 ]

4 голосов
/ 14 февраля 2011

Вы должны указать жизненный цикл для вашего DbContext, чтобы для одного вызова создавался только один экземпляр. StructureMap не содержит встроенного управления жизненным циклом WCF для каждого вызова, но вы можете найти одну реализацию в этом блоге

0 голосов
/ 14 февраля 2011

Я не знаю, нужно ли вам / нужно, чтобы StructureMap управлял созданием экземпляра dbcontext, взгляните на этот ответ, UoW и UoW Factory setup dbcontext для вызовов, которые должны быть сделаны в хранилище.

EF ObjectContext, Service and Repository - Управление временем жизни контекста.

0 голосов
/ 14 февраля 2011

Вам необходимо реализовать шаблон UnitOfWork, чтобы тот же контекст был общим для сущностей.Взгляните на http://blogs.msdn.com/b/adonet/archive/2009/06/16/using-repository-and-unit-of-work-patterns-with-entity-framework-4-0.aspx, чтобы узнать, как это осуществить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...