Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 跨所有API控制器/操作方法共享的全局静态对象_Asp.net Mvc_Asp.net Web Api - Fatal编程技术网

Asp.net mvc 跨所有API控制器/操作方法共享的全局静态对象

Asp.net mvc 跨所有API控制器/操作方法共享的全局静态对象,asp.net-mvc,asp.net-web-api,Asp.net Mvc,Asp.net Web Api,我需要在Asp.NETWebAPI中的所有控制器/操作方法中公开一个单例共享对象。哪一个是声明此类全局静态对象的最佳位置,以便所有控制器/操作方法都可以访问它?您可以在WebAPI应用程序(global.asax.cs)中声明变量,并在所有控制器中使用它,代码如下: var globalValue = (HttpContext.Current.ApplicationInstance as WebApiApplication).GlobalVariableName; 但对我来说,这不是最好的方法

我需要在Asp.NETWebAPI中的所有控制器/操作方法中公开一个单例共享对象。哪一个是声明此类全局静态对象的最佳位置,以便所有控制器/操作方法都可以访问它?

您可以在WebAPI应用程序(global.asax.cs)中声明变量,并在所有控制器中使用它,代码如下:

var globalValue = (HttpContext.Current.ApplicationInstance as WebApiApplication).GlobalVariableName;
但对我来说,这不是最好的方法,因为初始化和设置值会带来开销,而且看起来像是架构问题

为什么需要全局对象? 如果它是某个函数,只需声明新的父控制器并在其中声明此函数。
如果您需要只读数据,请将其放入web.cofig

您可以在WebAPI应用程序(Global.asax.cs)中声明变量,并在所有控制器中使用该变量,代码如下:

var globalValue = (HttpContext.Current.ApplicationInstance as WebApiApplication).GlobalVariableName;
但对我来说,这不是最好的方法,因为初始化和设置值会带来开销,而且看起来像是架构问题

为什么需要全局对象? 如果它是某个函数,只需声明新的父控制器并在其中声明此函数。 如果您需要只读数据,请将其放入web.cofig

您可以使用
Lazy
。这将确保螺纹安全:

public class Greeter
{
    public static readonly Lazy<Greeter> Instance = new Lazy<Greeter>(() => new Greeter());

    public Greeter()
    {
        // I am called once during the applications lifetime
    }

    public string Greet(string name)
    {
        return $"Hello {name}!";
    }
}
您可以使用
Lazy
。这将确保螺纹安全:

public class Greeter
{
    public static readonly Lazy<Greeter> Instance = new Lazy<Greeter>(() => new Greeter());

    public Greeter()
    {
        // I am called once during the applications lifetime
    }

    public string Greet(string name)
    {
        return $"Hello {name}!";
    }
}
“最佳”方法是使用DI(依赖项注入)容器,并将单例注入到需要它的控制器中。我将给出一个Ninject示例,因为我使用的就是Ninject,但是您可以轻松地将代码调整到您决定使用的任何容器

NinjectWebCommon.cs

kernel.Bind<MySingleton>().ToSelf().InSingletonScope();
public class FooController : ApiController
{
    protected readonly MySingleton mySingleton;

    public FooController(MySingleton mySingleton)
    {
        this.mySingleton = mySingleton;
    }
}
换句话说,DI容器管理单例。控制器接受singleton作为构造函数参数,并在控制器上设置它。然后,DI容器将单例注入控制器,然后您可以像控制器的任何其他成员一样自由使用它。

最好的方法是使用DI(依赖项注入)容器,并将单例注入需要它的控制器。我将给出一个Ninject示例,因为我使用的就是Ninject,但是您可以轻松地将代码调整到您决定使用的任何容器

NinjectWebCommon.cs

kernel.Bind<MySingleton>().ToSelf().InSingletonScope();
public class FooController : ApiController
{
    protected readonly MySingleton mySingleton;

    public FooController(MySingleton mySingleton)
    {
        this.mySingleton = mySingleton;
    }
}

换句话说,DI容器管理单例。控制器接受singleton作为构造函数参数,并在控制器上设置它。DI容器随后将单例注入控制器,然后您可以像控制器的任何其他成员一样自由使用它。

只需创建一个库并将单例放入其中。请不要使用静态对象或单例!ASP.NET MVC支持依赖注入,请使用它感谢这里的所有答案,提供的每个选项/答案都很好。只需创建一个库并将单例放在其中。请不要使用静态对象或单例!ASP.NET MVC支持依赖项注入,请在此处对所有答案使用iThanks,提供的每个选项/答案都很好。