- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我了解如何为 ASP.NET Core 注册依赖项,以及构造函数注入(inject)如何为我的 Controller 工作(我有那个工作)。是否所有的东西都必须通过构造函数传递,然后显式地传递给那些构造对象创建的对象,或者实例化的对象(例如我的 Controller 及其创建的对象)如何使用服务集合来访问或实例化其他对象对象?
2020 年 6 月 19 日更新:
假设我的 Startup 调用这个(这只是示例代码,看看我是否可以得到这个问题,因此我的帐户被取消):
public static IServiceCollection AddRepository(
this IServiceCollection services,
IConfiguration configuration)
{
var serviceProvider = services.BuildServiceProvider(); //TODO: dispose
ContentstackClient stack = serviceProvider.GetService<ContentstackClient>();
Trace.Assert(stack != null, "configure ContentstackClient service before IRepository service");
IConfigureSerialization configurator = serviceProvider.GetService<IConfigureSerialization>();
Trace.Assert(configurator != null, "configure IConfigureSerialization before ContentstackRepository");
configurator.ConfigureSerialization(stack.SerializerSettings);
//TODO: Apply ContentstackRepositoryConfiguration (UseSync, etc.) from appsettings.json
ContentstackRepositoryConfiguration repoConfig = ContentstackRepositoryConfiguration.Get(
ContentstackRepositoryConfiguration.StartType.FastestStartSync, stack);
services.AddSingleton<IRepository>(new ContentstackRepository(repoConfig));//, serviceProvider.GetService<ILogger>()));
//TODO: happens automatically? serviceProvider.Dispose();
return services;
}
我的 Controller 里有这个:
public EntryController(
IRepository repository,
ILogger<EntryController> logger,
ContentstackClient stack)
{
_repository = repository;
_logger = logger;
_stack = stack;
}
但是,如果我认为或其他地方的代码想要访问 IRepository 单例怎么办?我是否必须到处传递 IRepository,或者是否有某种方式可以通过服务定位器或其他方式显式访问它?
最佳答案
我知道asp.net core DI框架支持三种类型的组件注入(inject)。
(一)构造器
(2) Paramter invocation
(3) HttpContext.RequestServices
注意:HttpContext.RequestServices 使用服务定位器模式。这不是一个好的模式,但如果您失去了对服务的访问权限并且只能通过 HttpContext.RequestServices
获取它,那么它可能是可以接受的。
这是一个discussion关于它。
我重构了您的代码以注册一个Repository
服务。
public static IServiceCollection AddRepository(
this IServiceCollection services,
IConfiguration configuration)
{
// You can declare a singeton instance then declare IRepository is service and ContentstackRepository is your implementation class
// When you use pass IRepository in the controller constructor, actually you get the ContentstackRepository instance.
services.AddSingleton<IRepository, ContentstackRepository>(f =>
{
// Don't use this approach in the IServiceCollection, if you want register the instance.
// var serviceProvider = services.BuildServiceProvider();
// You can use the 'f' lamda to get IServiceProvider and use GetService to get the instance.
ContentstackClient stack = f.GetService<ContentstackClient>();
Trace.Assert(stack != null, "configure ContentstackClient service before IRepository service");
IConfigureSerialization configurator = f.GetService<IConfigureSerialization>();
Trace.Assert(configurator != null, "configure IConfigureSerialization before ContentstackRepository");
configurator.ConfigureSerialization(stack.SerializerSettings);
// return ContentstackRepository instance
ContentstackRepositoryConfiguration repoConfig = ContentstackRepositoryConfiguration.Get(ContentstackRepositoryConfiguration.StartType.FastestStartSync, stack);
return new ContentstackRepository(repoConfig);
});
}
如果你想在另一个类中使用IRepository
单例,你需要将它传递给构造函数。
如果想使用方法或者属性注入(inject),可以考虑使用Autofac这是很有用的 di 注入(inject)库。
关于c# - ASP.NET 核心 : need to access ServiceCollection explicitly?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61941315/
在围棋中,我尝试了简单的数据库连接。我需要进口大猩猩/MUX,但我不能。。我正在使用VS代码。在cd进入我的项目目录之后,我创建了main.go并运行了go get-u githorb.com/Gor
当基类中唯一的候选构造函数被标记为explicit时,派生类的实例是否可以隐式转换为其基类的实例? 我运行了这个: struct Base { Base() {} explicit Bas
我正在尝试创建一个模板类来强制执行尺寸正确性(长度除以时间得出速度,等等)。 短篇小说:“无量纲”是可能的实例之一。如果我可以允许所有实例化显式地从 double 构造,并且进一步允许“无量纲”实例化
为什么下面的代码不能编译,而当我在类 A 中删除构造函数之前的显式关键字时,它可以编译? 使用 Visual Studio 2013: enum E { e1_0, e1_1 }; template
有人能解释一下为什么我在这里遇到编译错误 - 错误 C2558:类“std::auto_ptr”:没有可用的复制构造函数或复制构造函数被声明为“显式” #include #include #inc
目前,我的 Localizable.strings 文件的文本编码设置为UTF-8。我所有其他可本地化的文件都设置为 no explicit。 我想将 UTF-8 更改为 No explicit,这怎
请引用Wikipedia:Strategy Pattern (C++) class Context { private: StrategyInterface * strateg
是否有理由为不带任何参数的构造函数使用 explicit 关键字?它有什么作用吗?我想知道,因为我刚刚遇到了这条线 explicit char_separator() 在记录 boost::char_
我经常听到人们称赞语言、框架、结构等是“明确的”。我试图理解这个逻辑。语言、框架等的目的是隐藏复杂性。如果它让您明确指定各种细节,那么它并没有隐藏太多复杂性,只是四处移动。显式有什么好处,你如何使语言
我知道有一些关于此的帖子,但大约一年了,没有回复。实际上我们使用的是 Hibernate 4.2.1.Final 而不是 PostgreSQL 8.4。我们有两个这样的实体 实体 A(顶级层次结构类)
数据“显式”传递给函数,而方法“隐式传递”给调用它的对象。 请您解释一下这两种传递数据的方式之间的区别? java 或 c# 中的示例会有所帮助。 最佳答案 Java 和 Python 语言就是说明这
R 非常棒:精简而灵活,但又强大又开放。对于小任务,如果不必在使用前声明每个变量会很方便。但是:特别是。在较大的项目中,小的拼写错误可能会搞砸一切,甚至可能没有错误消息(参见示例)! 有解决办法吗?如
我使用 python 和 selenium 编写了一个脚本,用于单击谷歌地图侧栏中列出的一些链接。单击任何项目时,每个潜在客户所附加的相关信息都会显示在右侧区域中。剧本做得很好。但是,我使用硬编码
在同一个页面同一个步骤,如果使用“wait”会得到错误信息“NoSuchElementException:消息:无法找到名称 == rw 的元素” 如果使用“switch_to_frame”将成功切换
我有以下代码部分,它给出了明确的 null 取消引用。 uint64_t *var1 = NULL; char *var2 = NULL; //Alias transfer var1 = (uint6
我的任务是迁移 C++ 类库中的错误处理概念。以前简单返回 bool(成功/失败)的方法应修改为返回一个 Result 对象,该对象传达机器可读的错误代码和人类可读的解释(以及更多在这里无关紧要的内容
我对这行代码有疑问: class S1Es3SharedState { //lock private final Lock lock = new ReentrantLock();
当我在我的代码中使用(最近发布的)Cppcheck 1.69 时 1 ,它显示了很多我没有预料到的消息。禁用 noExplicitConstructor 证明它们都属于这种类型。 但我发现我不是唯一一
这个问题与之前的 C++11 (C++03) 标准有关。 explicit 防止从一种类型到另一种类型的隐式转换。例如: struct Foo { explicit Foo(int); };
我们正在使用的外部库包含以下显式构造函数: class Chart { public: explicit Chart(Chart::Type type, Object *parent);
我是一名优秀的程序员,十分优秀!