嗨,我正在使用 IoC 容器,我想在构造函数中初始化一个服务(其中一部分涉及与数据库的“繁重工作”)。
此特定服务存储注入IPluginToServiceProviderBridge
服务找到的信息,此信息通过UnitOfWork
.
一旦一切都被引导,带有命令的控制器和带有处理程序的服务将用于所有其他交互。所有命令都包装在生命周期范围内,因此保存和处理UnitOfWork
是由处理程序而不是服务完成的(这对于干净的代码非常有用)。
保存和事务的相同整洁和关注点分离不适用于Initializer
服务内部,因为一切都发生在构造函数中:
public PluginManagerService(
IPluginToServiceProviderBridge serviceProvider,
IUnitOfWork unitOfWork)
{
this.unitOfWork = unitOfWork;
this.serviceProvider = serviceProvider;
lock (threadLock)
{
if (initialised == false)
{
LinkPluginsWithDatabase();
initialised = true;
}
// I don't like this next line, but
// not sure what else to do
this.UnitOfWork.Save();
}
}
protected void LinkPluginsWithDatabase()
{
var plugins =
this.serviceProvider.GetAllPlugins();
foreach (var plugin in plugins)
{
var db = new PluginRecord
{
interfaceType = plugin.InterfaceType;
var id = plugin.Id;
var version = plugin.Version;
}
// store in db via unit of work repository
this.unitOfWork.PluginsRepository.Add(db);
}
}
几点:
理想情况下,我想避免使用工厂,因为它会使作用域生命周期的处理复杂化,如果我知道如何进行重构以实现更好的分离,我会很乐意。
我真的想避免Init()
为服务使用单独的方法,虽然它允许通过命令/处理程序进行事务和保存,但需要大量检查代码,我相信这也会引入时间问题。
鉴于上述情况,UnitOfWork.Save()
在我的构造函数中调用是否可以接受,或者我可以重构更清晰的代码和更好的分离?