Виндзорский замок DefaultTypedFactoryComponentSelector проблема стиля соединения - PullRequest
0 голосов
/ 31 октября 2018

Я использую задание планировщика 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 работать с ограниченным образом жизни?

...