由于我使用的是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核心中没有构造函数的情况下解决依赖关系吗?就像在公共库中解析一样,在没有构造函数的静态方法中。
提前致谢!
答案 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”方法即可。