我正在使用定期运行的Quartz调度程序作业,其中使用温莎城堡的nhibernate连接解析(使用生活方式绑定到调度程序作业),以便在作业运行时它将使用相同的连接。如果使用瞬态生活方式,那么它可以工作,但由于分开的连接而无法关联实体。 Job调用另一个dll,并使用带有连接的存储库来持久保存文档并关联支持文档。
Classes.FromAssemblyInThisApplication()
.Where(t => typeof(IRepositoryConnection).IsAssignableFrom(t))
.WithService.DefaultInterfaces()
.LifestyleBoundTo<LoggedJob>(),
生活方式必然会给我带来以下错误。
System.InvalidOperationException:作用域不适用于 'Repositories.RepositoryConnection'。组件中没有更高的组件 分辨率堆栈满足指定范围的标准。 这通常表示自定义范围根选择器存在错误或 该组件正在无法预见的环境中解析(又名- 这可能是应用程序中依赖项如何存在的错误 有线)。
我调试了代码,发现作业使用DefaultTypedFactoryComponentSelector,它根据发票类型将返回生成器,并且其中一个生成器在失败的地方使用连接。
public class FactoryComponentSelector : DefaultTypedFactoryComponentSelector
{
protected override string GetComponentName(MethodInfo method, object[] arguments)
{
if (method?.Name == nameof(ITaskFactory.CreateTask) && arguments?.Length > 0 &&
arguments[0] is Template)
{
return arguments[0].ToString();
}
return base.GetComponentName(method, arguments);
}
}
上述项目的注册如下,除父母注册外,在单独的项目中
if(!container.Kernel.GetFacilities().OfType<TypedFactoryFacility>().Any())
container.AddFacility<TypedFactoryFacility>();
container.Register(
Component.For<FactoryComponentSelector>(),
Component.For<ITask>()
.ImplementedBy<PdfInvoiceSupportingDocumentGenerateTask>()
.Named(Template.Pdf.ToString())
.LifestyleTransient(),
Component.For<ITask>()
.ImplementedBy<CsvInvoiceSupportingDocumentGenerateTask>()
.Named(Template.Csv.ToString())
.LifestyleTransient(),
Component.For<ITask>()
.ImplementedBy<CsvPerTransactionInvoiceSupportingDocumentGenerateTask>()
.Named(Template.CsvPerTransactionType.ToString())
.LifestyleTransient(),
Component.For<ITask>()
.ImplementedBy<CsvTotalByTimesheetInvoiceSupportingDocumentGenerateTask>()
.Named(Template.CsvTotalByTimesheet.ToString())
.LifestyleTransient(),
Component.For<ITask>()
.ImplementedBy<CsvTotalByEmployeeInvoiceSupportingDocumentGenerateTask>()
.Named(Template.CsvTotalByEmployee.ToString())
.LifestyleTransient(),
Component.For<ITaskFactory>()
.AsFactory(f => f.SelectedWith<FactoryComponentSelector>())
.LifestyleTransient()
);
有什么想法可以使nhibernate连接与范围有限的生活方式一起工作吗?