解耦我的ObjectContext

时间:2015-07-20 04:35:00

标签: c# dependency-injection ninject inversion-of-control

我有一个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分离?

1 个答案:

答案 0 :(得分:3)

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

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。