2011-02-14 157 views
4

我有這樣實體框架的DbContext在每個呼叫實例模式WCF

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

} 

具體倉庫的倉庫我有這樣

[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 
    } 


} 
WCF服務

和我正在使用StructureMap注入這樣的DbContext實例

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

我的問題是,當一個客戶端調用服務,新CustomerSatisfactionService實例被創建的CustomerRepository因此新的實例和HelpdeskRepository創建,但不同的DbContexts。

我想實現工作單元模式,但在DoSomethingWithBothRepositories方法中,這兩個存儲庫有不同的DbContexts。

有沒有什麼辦法可以告訴結構圖在每次調用的基礎上創建一個DbContext實例?

回答

4

您必須爲您的DbContext指定生命週期,以便每次調用只創建一個實例。 StructureMap不包含每個調用WCF的內置生命週期管理,但您可以在this blog上找到一個實現。

+0

喜拉吉斯拉夫......似乎這可能是一個解決方案...會嘗試,讓你知道...謝謝。 – 2011-02-15 05:01:40

+0

我在這裏找到了確切的答案http://andreasohlund.net/2009/04/27/unitofwork-in-wcf-using-structuremap/ – 2011-02-19 13:11:14

+1

您的博客鏈接已損壞。 – rboarman 2012-08-13 23:11:27