wcf每次调用实例模式下的实体框架DbContext

发布于 2024-10-17 11:55:14 字数 1937 浏览 2 评论 0原文

我有一个像这样的存储库

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 的新实例> 已创建,但使用不同的 DbContext。

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

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

I have a repository like this

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

and a concrete repository like this

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

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

}

I have wcf service like this

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


 }

and I am using StructureMap for injecting DbContext instances like this

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

My problem is when a client calls the service, a new CustomerSatisfactionService instance is created, hence new instances of CustomerRepository and HelpdeskRepository are created but with different DbContexts.

I want to implement the unit of work pattern, but in the DoSomethingWithBothRepositories method, the two repositories have different DbContexts.

Is there any way to tell structure map to spin up a DbContext instance on a per call basis?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

念三年u 2024-10-24 11:55:15

您必须指定 DbContext 的生命周期,以便每次调用仅创建一个实例。 StructureMap 不包含针对每次调用 WCF 的内置生命周期管理,但您可以在 此博客

You must specify lifecycle for your DbContext so that only one instance is created per call. StructureMap doesn't contain build-in lifecycle management for per call WCF but you can find one implementation on this blog.

相权↑美人 2024-10-24 11:55:15

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

You need to implement UnitOfWork pattern so that same context is shared amongst entities. Take a look at http://blogs.msdn.com/b/adonet/archive/2009/06/16/using-repository-and-unit-of-work-patterns-with-entity-framework-4-0.aspx for a way to implement it.

离笑几人歌 2024-10-24 11:55:15

我不知道您是否需要/想要 StructureMap 来控制 dbcontext 的实例化,请查看此回复,UoW 和 UoW Factory setup dbcontext 用于需要在存储库中进行的调用。

EF ObjectContext、服务和存储库 - 管理上下文生命周期。< /a>

I don't know if you need/want StructureMap to control the instantiation of dbcontext, have a look at this reply, UoW and UoW Factory setup dbcontext for the calls that need to be made in the repository.

EF ObjectContext, Service and Repository - Managing context lifetime.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文