首先,我的情况。我有一个服务BillingService,有一个像这样的构造函数:
BillingService(IInstallmentService,IBillingRepository)
InstallmentService具有一个类似如下的构造函数
InstallmentService(IBillingRepository,IInstallmentCalculator)
我的帐单服务是一项应用程序服务,这些方法将协调移动部件之间的操作。一切都注册在我的IoC容器中,因此我的外观仅需要解析IBillingService并调用该操作。
我的BillingService和分期付款服务都需要访问BillingRepository。我只需要打开一个数据库连接,因此理想情况下BillingRepository在构造函数中采用IDbCOnnection。
我的问题是,如何将打开的连接从容器传递到BillingRepository中,然后在完成BillingService后有效关闭它?我在这个客户端上停留在Unity上。如果我用手写的话,看起来会像这样:
using(IDbConnection conn = DbFactory.GetConnection())
{
IBillingRepository repo = new BillingRepository(conn);
IInstallmentCalculator calc = new InstallmentCalculator();
IInstallmentService installmentService = new InstallmentService(repo,calc);
IBillingService billService = new BillingService(installmentService, repo);
billService.DoSomething(parameters);
}
最佳答案
就像在您的示例中一样,我将对连接的依赖性引入了BillingRepository
,但是让Unity创建连接。
确保BillingRepository
实现IDisposable
(也可能是计费服务),并将其设置为临时对象(无论如何用Unity表示)。
如果计费存储库维护一些需要更长寿命的状态(例如,在应用程序的生命周期中),那么我会将其分解为另一个类,并使计费存储库也依赖于该类。