解耦我的 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。
我有一个 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。