我有一个像这样的存储库
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实例?
答案 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)