【问题标题】:How do I use Ninject to inject a static property?如何使用 Ninject 注入静态属性?
【发布时间】:2010-11-20 03:15:12
【问题描述】:

我正在使用 ASP.NET MVC 2 来实现 Web 服务,并且我有一个自定义的 JsonResult 类:

public abstract class JsonResult : ActionResult
{
    public static ISerializer Serializer { get; set; }

    public override void ExecuteResult(ControllerContext context)
    {
        var json = Serializer.Serialize(this);
        context.HttpContext.Response.Write(json);
    }
}

JsonResult 是所有应序列化为 JSON 数据的结果的抽象基类。它使用ISerializer 进行序列化。

我使用 Ninject 作为我的 IoC 容器。但是,我不太确定应该如何注入 ISerializer 依赖项。我最初是这样做的:

var kernel = new StandardKernel().Bind<ISerializer>().To<JsonNetSerializer>();
JsonResult.Serializer = kernel.Get<ISerializer>();

但它似乎不太对劲。那么我将如何正确注入 Serializer 属性呢?我只想在应用程序启动时注入一次。

【问题讨论】:

    标签: c# asp.net-mvc dependency-injection inversion-of-control ninject


    【解决方案1】:

    对不起,MVC 不是我的联盟,但是有什么原因你不能删除 static 修饰符,将 JsonNetSerializer 的生命周期设置为单例,并将其注入 JsonResult 的构造函数?请特别注意,这使得对ISerializer 的依赖显式(一件好事)并避免static(一件好事)。

    【讨论】:

    • 那么这是否意味着,为了将Serializer 属性保持为单例,我必须始终使用IoC 容器来实例化JsonResult 的实例?
    • @Daniel T.:最好你应该使用工厂。因此,如果您有一个实例化ConcreteJsonResult 的类,它应该采用JsonResultFactory。当然,您可以按照return kernel.Get&lt;TJsonResult&gt;(); 的方式制作JsonResultFactory.Create&lt;TJsonResult&gt;
    • 谢谢杰森。我一直避免创建工厂,因为我的应用程序非常简单,以至于使用工厂似乎不必要地使事情复杂化,但我想我会尝试一下。
    • 使用工厂通常是许多关于依赖注入问题的答案;-)
    猜你喜欢
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    相关资源
    最近更新 更多