Я использую задание планировщика Quartz, которое периодически запускается, когда разрешение соединения nhibernate с использованием Windsor Castle использует стиль жизни, связанный с заданием планировщика, чтобы при запуске задания оно использовало то же соединение. Если используется временный стиль жизни, он работает, но не связывает сущности из-за отдельной связи. Job вызывает другую dll и использует хранилище с подключением для сохранения документа и связывания подтверждающих документов.
Classes.FromAssemblyInThisApplication()
.Where(t => typeof(IRepositoryConnection).IsAssignableFrom(t))
.WithService.DefaultInterfaces()
.LifestyleBoundTo<LoggedJob>(),
в то время как образ жизни, связанный с работой, выдаст мне следующую ошибку.
System.InvalidOperationException: область была недоступна для
'Repositories.RepositoryConnection. Нет компонента выше в
стек разрешения соответствовал критериям, указанным для определения объема компонента.
Обычно это указывает на ошибку в пользовательском селекторе корня или средства
что компонент разрешается в непредвиденном контексте (a.k.a -
это, вероятно, ошибка в том, как зависимости в приложении
проводной).
Я отладил код и обнаружил, что задание использует 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 работать с ограниченным образом жизни?