温莎城堡DefaultTypedFactoryComponentSelector范围连接生活方式的问题

时间:2018-10-31 10:54:25

标签: castle-windsor windsor-facilities

我正在使用定期运行的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连接与范围有限的生活方式一起工作吗?

0 个答案:

没有答案