Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.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
Net核心:通过非控制器库中的依赖注入获取所需服务。例如C#公共图书馆_C#_Dependency Injection_Asp.net Core - Fatal编程技术网

Net核心:通过非控制器库中的依赖注入获取所需服务。例如C#公共图书馆

Net核心:通过非控制器库中的依赖注入获取所需服务。例如C#公共图书馆,c#,dependency-injection,asp.net-core,C#,Dependency Injection,Asp.net Core,当我使用Asp.net内核的默认依赖项注入功能时,通过构造函数解析依赖项非常有效 例如 注册: public static void AddServices(this IServiceCollection services, IConfigurationRoot configuration) { services.AddScoped<ICookieManager, CookieManager>(); } protected ICookieManager CookieMana

当我使用Asp.net内核的默认依赖项注入功能时,通过构造函数解析依赖项非常有效

例如

注册:

public static void AddServices(this IServiceCollection services, IConfigurationRoot configuration)
{
    services.AddScoped<ICookieManager, CookieManager>();
}
protected ICookieManager CookieManager { get; set; }

public HomeController(ICookieManager cookieManager)
{
    this.CookieManager = cookieManager;
}
以上代码非常有效

现在,我有一个名为
library.Common
的库,其中我编写了一些可供不同项目使用的通用功能

在我的公共库代码中,如果没有构造函数,如何解析依赖关系

我想要这样的东西:

public void CalculateOrder()
{
    var cookieManager = ServiceLocator.Instance.GetService<ICookieManager>();
}
public void CalculateOrder()
{
var cookieManager=ServiceLocator.Instance.GetService();
}
有人能帮我找出在Asp.net内核中没有构造函数的情况下如何解决依赖关系吗?就像在公共库中解析一样,在没有构造函数的静态方法中解析


提前谢谢

将其保留为构造函数注入依赖项。如果您的公共库要在使用DI的多个项目中使用,那么它可以正常工作(假设您正确配置DI容器)。如果未使用DI,则可以简单地构造ICookieManager实现的实例,并将其作为参数传递给构造函数


您也可以考虑使用属性注入来实现依赖性,尽管在您的方法,CalgATORD ORD()中,如果没有ICOOKIMANANGER依赖项,仍然可以提供一些函数值。如果这是.NETCore中的一个新项目,那么最好从一开始就做正确的事情

这就是说,如果您非常需要使用ServiceLocator,或者您正在跨多个应用程序迁移项目,并且不想一次完成所有操作就可以使用构造函数DI,那么您可以简单地创建一个使用.NET Core的可注入DI的静态ServiceLocator类


这里有一个例子:您只需创建一个静态类,该类只需从.NETCore的服务集合运行“GetService”方法

不要这样做。服务定位器模式击败了首先使用IoC/DI容器的想法。只需使用构造函数注入,就可以开始了。你可以使用抽象它的工厂。当您尝试访问作用域资源时,服务定位器会对您造成很大的伤害。服务定位器是一种反模式,使得测试非常复杂且容易出错。如果您声明没有构造函数,是否可以将
ICookieManager
作为参数传递到
CalculateOrder
方法中?