代码之家  ›  专栏  ›  技术社区  ›  Simon Keep

如何使用castle windsor将运行时参数传递给以前注册的工厂方法?

  •  3
  • Simon Keep  · 技术社区  · 16 年前

    我有一个使用Castle Windsor的报告MVC应用程序。

    我需要根据请求中传递的参数将一个从属类型切换为另一个从属类型。

    我已经向windsor注册了一个工厂方法来处理可切换类型的解析,但是由于这是在应用程序启动时注册的,当参数仅在以后的请求中可用时,我如何将参数传递给工厂方法?

    4 回复  |  直到 16 年前
        1
  •  2
  •   Jeff Sternal    16 年前

    当您需要在运行时解析类型时,通常的解决方案是注入一个工厂,该工厂可以在适当的时间做出决定:

    public class ReportFactory: IReportFactory {
        IReport CreateReport(bool useDefault) {
            if (useDefault) {
                return new DefaultReport();
            } else {
                return new UnusualReport();
            }
        }
    }
    

    以前需要 IReport 应该要求 IReportFactory 相反。

        2
  •  2
  •   user22467 user22467    16 年前

    你有两个选择。首先是使用HttpContext.当前工厂内部方法。

    IWhatever CreateWhatever() {
         if (HttpContext.Current.Request["parameter"] == "value-for-other-whatever")
           return new FirstWhatever();
    
         return DefaultWhatever();
    }
    

    另一个(更好的)选择是注入一个解析正确实现的工厂类型,而不是让容器为您完成。

    public class WhateverFactory : IWhateverFactory {
         public IWhatever GetWhatever(string parameter) {
             if(parameter == "value for other whatever")
                return new OtherWhatever();
    
             return new DefaultWhatever();
         }
    }
    

        3
  •  2
  •   Krzysztof Kozmic    16 年前

    使用 TypedFactoryFacility

    你可以采取两种方法:

    public interface IFooFactory
    {
       IFoo GetFoo(...arguments);
       IFoo GetCustomFoo(..arguments);
    
       void ReleaseFoo(IFoo foo);
    }
    
        4
  •  1
  •   Simon Keep    15 年前

    遇到了一个 article 在Mike Hadlow的博客上,使用一个在Windsor注册的委托返回许多命名类型注册中的一个。。。

         container
                .Register(
                        Component.For<IReportFormatter>().ImplementedBy<ReportFormatterWord2003>().Named("word2003"),
                        Component.For<IReportFormatter>().ImplementedBy<ReportFormatterWord2007>().Named("word2007"),
                        Component.For<IReportFormatter>().ImplementedBy<ReportFormatterPdf>().Named("pdf"),
                        Component.For<Func<string, IReportFormatter>>().Instance(container.Resolve<IReportFormatter>),
                        Component.For<Foo>());
    

    Foo构造函数将采用委托类型的参数

    Foo(Func<string, IReportFormatter> reportFormatterFactory)
    

    现在,当Windsor解析Foo时,reportFormatterFactory并没有解析为IReportFormatter的实现,它只是保存对容器。解决方法。。。

    container.Resolve<IReportFormatter>(string)
    

    reportFormatterFactory("word2007");
    

    也许不像注册工厂那么容易理解,但它消除了对工厂类的需要。

    推荐文章