每个调用实例模式的wcf中的实体框架DbContext

时间:2011-02-14 17:31:02

标签: wcf entity-framework structuremap repository-pattern

我有一个像这样的存储库

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实例,因此会创建CustomerRepositoryHelpdeskRepository的新实例,但使用不同的DbContexts。

我想实现工作单元模式,但在DoSomethingWithBothRepositories方法中,这两个存储库具有不同的DbContexts。

有没有办法告诉结构图在每次调用的基础上启动DbContext实例?

3 个答案:

答案 0 :(得分:4)

您必须为DbContext指定生命周期,以便每次调用只创建一个实例。 StructureMap不包含每个调用WCF的内置生命周期管理,但您可以在this blog上找到一个实现。

答案 1 :(得分:0)

您需要实现UnitOfWork模式,以便在实体之间共享相同的上下文。请查看http://blogs.msdn.com/b/adonet/archive/2009/06/16/using-repository-and-unit-of-work-patterns-with-entity-framework-4-0.aspx以了解实现它的方法。

答案 2 :(得分:0)