IoC(温莎城堡)和静态助手

时间:2009-06-08 15:05:15

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

如何在请求对象时将Castle Windsor配置为使用Initialize方法作为静态助手类?我试图添加一些扩展方法HtmlHelper,所以它必须是一个静态类和方法。我的HtmlHelper扩展程序取决于已使用Castle Windsor配置的IHtmlHelpersService。我正在使用Convention Over Configuration。

修改 我认为我想要的是ComponentActivatorUsingFactory。我会这样走下去吗?

4 个答案:

答案 0 :(得分:1)

我认为你的意思是Convention over configuration

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

另一个选择是为所有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公开服务并继续编写以该帮助程序为目标的扩展方法。

答案 3 :(得分:-1)

您可以通过这种方式重构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();
  }
}