Asp.Net核心:通过非控制器库中的依赖注入获得所需的服务。例如。 C#通用库

时间:2017-04-25 11:28:30

标签: c# dependency-injection asp.net-core

由于我使用的是Asp.net核心的默认依赖注入功能,因此通过构造函数解析依赖项可以很好地工作。

E.g。

注册

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>();
}

有人会帮助我找出如何在Asp.net核心中没有构造函数的情况下解决依赖关系吗?就像在公共库中解析一样,在没有构造函数的静态方法中。

提前致谢!

2 个答案:

答案 0 :(得分:0)

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

您还可以考虑对依赖项使用属性注入,尽管这最适合您的方法CalculateOrder()在没有ICookieManager依赖项的情况下仍能提供某些功能值。

答案 1 :(得分:0)

现有的答案是正确的,因为有很多理由使用构造函数DI可能更好。如果这是.NET Core中的新项目,那么最好从一开始就做好事。

话虽这么说,如果您极度需要使用ServiceLocator,或者您正在迁移项目,并且您不希望一次性重做所有内容以使用构造函数DI,您只需创建一个静态ServiceLocator类它使用.NET Core的可注射DI。

这方面的一个示例是:https://dotnetcoretutorials.com/2018/05/06/servicelocator-shim-for-net-core/您只需创建一个静态类,只需从.NET Core的Service Collection中运行“GetService”方法即可。