首先,我的方案。我有一个服务,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);
}
答案 0 :(得分:0)
我对Unity没有多少经验,但我会将连接详细信息保存到您的BillingRepository,并通过属性将打开的连接传递给其他对象。
因此,在您的容器中创建一个返回BillingRepository对象的属性,然后您可以通过任何其他对象中的该属性访问您的打开连接。
答案 1 :(得分:0)
我在BillingRepository
中引入了对连接的依赖,就像你的例子一样,但是让Unity创建连接。
确保BillingRepository
实现IDisposable
(也可能是计费服务),并将其设置为临时对象(不过在Unity中表示)。
如果计费存储库维护了一些需要更长生命周期的状态(例如,应用程序的生命周期),我会将其分解为另一个类,并使计费存储库也依赖于此。