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