【问题标题】:IoC (Castle Windsor) and Static HelpersIoC(温莎城堡)和静态助手
【发布时间】:2009-06-08 15:05:14
【问题描述】:
如何配置 Castle Windsor 以在请求对象时对静态帮助程序类使用 Initialize 方法?我正在尝试添加一些扩展方法HtmlHelper,因此它必须是静态类和方法。我的HtmlHelper 扩展依赖于一个已经配置有Castle Windsor 的IHtmlHelpersService。我正在使用约定优于配置。
编辑
我想我想要的是ComponentActivator 或UsingFactory。这样我是不是走上了死胡同?
【问题讨论】:
标签:
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();
}
}