解耦我的 ObjectContext

Decoupling my ObjectContext

我有一个 ASP.NET MVC 应用程序,它让我的控制器调用命令调用程序来执行 CRUD 操作。命令处理程序在我的域层程序集中。命令处理程序之一使用以下代码保存记录:

public class SaveTransactionCommandHandler : ICommandHandler<SaveTransactionCommand>
{
    public void Handle(SaveTransactionCommand command)
    {
        using (GiftCardEntities db = new GiftCardEntities())
        {
            db.Transactions.AddObject(new Transaction
            {
                GiftCardId = command.GiftCardId, 
                TransactionTypeId = Convert.ToInt32(command.TransactionTypeId), 
                Amount = command.Amount,
                TransactionDate = DateTime.Now
            });
            db.SaveChanges();
        }
    }
}

但是,如您所见,我的处理程序依赖于 ObjectContext (EF)。我正在学习 Ninject 的依赖注入。现在我知道我的处理程序(域对象)不应该依赖于任何数据层对象。但在我的例子中,处理程序依赖于 GiftCardEntities,它是一个 ObjectContext。如何更改我的处理程序以使其与 ObjectContext 分离?

你应该使用存储库模式。存储库将抽象使用的实际数据访问技术。通过这种方式,您可以拥有针对不同数据访问技术的多个存储库实现,您可以在不更改业务层代码的情况下进行切换。 所以,你的处理程序看起来像

public class SaveTransactionCommandHandler : ICommandHandler<SaveTransactionCommand>
{
    readonly ITransactionRepository repository;

    public SaveTransactionCommandHandler(ITransactionRepository repository)
    {
          this.repository = repository;
    }
    public void Handle(SaveTransactionCommand command)
    {

            repository.Save(new Transaction
            {
                GiftCardId = command.GiftCardId, 
                TransactionTypeId = Convert.ToInt32(command.TransactionTypeId), 
                Amount = command.Amount,
                TransactionDate = DateTime.Now
            });

    }
}  

存储库实例将通过 DI 容器注入到您的处理程序中,在您的情况下 ninject。