【问题标题】:IoC (Castle Windsor) and Static HelpersIoC(温莎城堡)和静态助手
【发布时间】:2009-06-08 15:05:14
【问题描述】:

如何配置 Castle Windsor 以在请求对象时对静态帮助程序类使用 Initialize 方法?我正在尝试添加一些扩展方法HtmlHelper,因此它必须是静态类和方法。我的HtmlHelper 扩展依赖于一个已经配置有Castle Windsor 的IHtmlHelpersService。我正在使用约定优于配置。

编辑 我想我想要的是ComponentActivatorUsingFactory。这样我是不是走上了死胡同?

【问题讨论】:

    标签: c# static extension-methods castle-windsor


    【解决方案1】:

    我想你的意思是Convention over configuration

    我不知道有什么方法可以按照你的建议去做。这有点 hacky,但你总是可以创建一个非静态的类,它符合接口并简单地执行你需要的静态方法。在使用第三方项目时,有时这种事情是必要的。当然,如果您为 Castle 项目提供静态支持补丁,他们可能会接受它

    【讨论】:

      【解决方案2】:

      我不认为 IoC 可以帮助您处理静态类,Windsor(或任何其他 IoC)需要它可以实例化的东西(调用构造函数)。

      您是否尝试根据配置替换辅助方法? 如果是这样,也许您可​​以编写一组扩展方法来调用 IoC 来实现它们。

      【讨论】:

        【解决方案3】:

        另一种选择是为所有 ViewPages 创建一个基类。用您自己的版本隐藏现有的 HtmlHelper 属性:

        public class MyHtmlHelper : HtmlHelper
        {
          // Take helper service, implement special methods
        }
        
        public class MyViewPage : ViewPage
        {
          protected new MyHtmlHelper HtmlHelper { get; set; }
          // Wire up HtmlHelper as appropriate -- which is not going to be easy since
          // the base property could be set at any time.
        }
        

        现在您的所有视图页面都将使用您的特殊 MyHtmlHelper 和您所有的特殊调味料,它们甚至不需要是扩展方法。一种变体是让您的 MyHtmlHelper 公开服务并继续编写针对该帮助程序的扩展方法。

        【讨论】:

          【解决方案4】:

          您可以从这里http://code.google.com/p/autofac/wiki/ExistingApplications

          适配静态类:

          有时应用程序会将相关功能分组为一类静态函数:

          static class IdGenerator
          {
            static int _next = 0;
            public static int GetNext()
            {
              return ++_next;
            }
          }
          

          这种设计通常不会出现在使用依赖注入创建的应用程序中。

          相反,创建一个提供相同功能的接口:

          interface IIdGenerator
          {
            int GetNext();
          }
          

          还有一个使用静态方法的实现适配器类:

          class IdGeneratorAdapter : IdGenerator
          {
            public int GetNext()
            {
              return IdGenerator.GetNext();
            }
          }
          

          【讨论】:

          • 这不能回答我的问题。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多