- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对如何在使用控制台应用程序时避免服务定位器感到有点困惑
程序
public static int Main(string[] args)
{
// Configuration
var configuration = new ConfigurationBuilder().AddJsonFile("appsettings.json").AddEnvironmentVariables().Build();
// DI container
var services = new ServiceCollection();
ConfigureServices(services, configuration);
var serviceProvider = services.BuildServiceProvider();
// Do I pass along the serviceProvider?
// Can resolve using locator pattern do I just use this in my classes?
// var exampleRepository = _serviceProvider.GetService<IExampleRepository>();
// Execute the correct command based on args
return CommandLineOptions.Execute(args);
}
private static void ConfigureServices(IServiceCollection services, IConfiguration configuration)
{
services.AddScoped<ApplicationDbContext>((s) => new ApplicationDbContext(configuration.GetSection("Data:DefaultConnection:ConnectionString").Value));
services.AddScoped<IExampleRepository, ExampleRepository>();
}
命令行选项
public static class CommandLineOptions
{
public static int Execute(string[] args, IServiceProvider serviceProvider)
{
try
{
var app = new CommandLineApplication
{
Name = "dnx abc",
FullName = "Abc Commands",
Description = "ABC",
};
app.VersionOption("--version", PlatformServices.Default.Application.ApplicationVersion);
app.HelpOption("-?|-h|--help");
app.OnExecute(() =>
{
//ShowLogo();
app.ShowHelp();
return 2;
});
app.Command(
"task",
task=>
{
task.Name = "Task1";
task.FullName = "Task1";
task.Description = "Tasks";
task.HelpOption("-?|-h|--help");
task.OnExecute(() => { task.ShowHelp(); return 0; });
task.Command(
"task1",
data =>
{
data.FullName = "Task1 command";
data.Description = "Task1";
data.OnExecute(() =>
{
// Need to inject
var p = new Task1();
p.Process()
return 0;
});
我需要将 IExampleRepository 注入(inject)新的 Task1()
任务 1
public class Task1
{
public Task1()
{
}
private readonly IExampleRepository _exampleRepository;
public Task1(IExampleRepository exampleRepository)
{
_exampleRepository = exampleRepository;
}
public void Process() {
....
}
所以基本上我的理解是我注册了我的依赖项,然后我应该能够在我的类(class)中注入(inject)它们。我不确定是否需要将我的 serviceProvider 传递下去?
我相信在 MVC 中有魔法恰好可以实现这一点。如果不使用服务定位器模式,我将如何进行注入(inject)?
最佳答案
基本上,您不希望必须将 IServiceProvider
传递给除 Bootstrap (Startup
) 或工厂方法/类之外的任何类,因为这将您的类与特定的IoC 容器。
您可以做的是将依赖项添加到您的 CommandLineApplication
类并在 Main
方法中解析它,然后您可以从这里开始您的依赖项注入(inject)链。只要您需要/想要一次解决所有依赖关系,这就会起作用。
当你遇到只需要加载它的一个子集的情况(即在传递某个参数时使用不同的服务或程序逻辑),你将需要一种工厂(工厂是一个瘦在传递对象之前创建和配置对象的包装器,在 IoC 的情况下,它还解决了依赖关系)。
在工厂实现中,如有必要,可以引用容器(您需要范围内的依赖项或每个对象创建的 transient 解析)。如果您需要多个 Task1
实例,您还需要一个工厂。
有两种方法。对于非常简单的工厂,您可以使用工厂方法,它可以在您进行 IServiceCollection
注册时直接使用。
services.AddTransient<Task1>();
services.AddTransient<Func<Task1>>( (serviceProvider) => {
return () => serviceProvider.GetService<Task1>();
});
然后注入(inject)你的依赖。
public class MyTaskApplication
{
private readonly Func<Task> taskFactory;
public MyApplicationService(Func<Task> taskFactory)
{
this.taskFactory = taskFactory;
}
public void Run()
{
var task1 = taskFactory(); // one instance
var task2 = taskFactory(); // another instance, because its registered as Transient
}
}
如果您需要更复杂的配置或带有运行时参数,那么制作一个工厂类可能更有意义。
public class TaskFactory : ITaskFactory
{
private readonly IServiceProvider services;
public TaskFactory(IServiceProvider services)
{
this.services = services;
}
public Task1 CreateNewTask()
{
// get default task service, which is transient as before
// so you get a new instance per call
return services.GetService<Task1>();
}
public Task1 CreateNewTask(string connectionString)
{
// i.e. when having multiple tenants and you want to
// to the task on a database which is only determined at
// runtime. connectionString is not know at compile time because
// the user may choose which one he wants to process
var dbContext = MyDbContext(connectionString);
var repository = new ExampleRepository(dbContext);
return new Task1(repository);
}
}
以及用法
public class MyTaskApplication
{
private readonly ITaskFactory taskFactory;
public MyApplicationService(ITaskFactory taskFactory)
{
this.taskFactory = taskFactory;
}
public void Run()
{
// Default instance with default connectionString from appsettings.json
var task1 = taskFactory.CreateNewTask();
// Tenant configuration you pass in as string
var task2 = taskFactory.CreateNewTask(tenantConnectionString);
}
}
关于c# - asp.net 核心服务定位器如何在控制台应用程序中避免,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36927869/
这里有点绝望。我有一个使用由 Node 8.12.0 驱动的 AngularJS (5.4.1) 的遗留测试套件。我想调试一些测试,但似乎不可能。 测试中启用了控制流,因此我按照 the protra
我想知道是否有任何方法可以在我的 html 中定义一个区域(div 标签?),其中模板根据它绑定(bind)到的对象而变化? 假设我们有一个 ShellView/ShellViewModel List
我在 WebDriver 中自动化报告提交过程,报告有多个页面,所有页面中都会有 Next按钮进入下一页。 下一个按钮有一个跟随定位器, Next 问题是所有Next报告中的按钮具有相同的定位器,因为
如果我想找一个也有特定类的中继器怎么办?或者,如果我想查找包含文本的绑定(bind)? 如果我想通过 repeater OR CSS 选择器(匹配具有特定 repeater 表达式 OR 的元素,例如
在我当前的项目中,我们从 XSD 文件生成 JAXB bean。我们需要有关 bean 的行号信息(除了 XSD 验证错误!)所以我使用了此处指定的 -Xlocator 选项: http://java
我有一个 Angular 应用程序,我在其中放置自定义 html 属性(“data-testid='saveButton'”)以用于识别,例如按钮、输入等Protractor 对此没有内置定位器:xp
我是 Protractor 和 E2E 测试的新手,想确定我的 CSS 定位器方法是否适用于同一类的相同元素。 我有一个 HTML Fiddle here它描绘了一个包含两个 div 元素的网页,每个
Delete Edit 我想为“编辑”按钮编写一个 CSS 定位器。它在 [data-credit-card-index="1"] 部分下...那里会有更多的信用卡...所以我必须使
我有 3 个下拉列表,它们不是选择类。所以我需要点击每个元素的向下箭头键。这些箭头键的样式相同:.Select-arrow(使用的火路) HTML: NicknameEx. LarrySaint, L
我正在尝试对我的网站进行测试。在某些用户表单上遇到问题。诀窍是,表单中文本字段的数量因用户选项而异(代码中存在禁用的文本字段,但具有样式 标记),所以我'我试图找到比逐个定位每个元素并用 try/e
I have a problem with ng-binding locator in Protractor code: some_link I tried to use: element(by
假设我正在#myPage 元素下寻找一些 div 元素。 我的目标是使用 CSS 选择器并将搜索限制为 #myPage 后代。 使用 Selenium XPath 定位器,我可以编写如下内容: Web
如何以文本“步骤1.设定 self 开发的方向”为起点,选择Xpath定位器到复选框? 为方便起见,您可以从此处复制文本: pdp-action-item-header__checkbox pdp-a
我需要简要介绍一下根据 IP 地址将内容限制在特定国家/地区背后的弱点。 除了使用位于另一个国家的代理服务器,你能想出另一种方法来绕过这样的系统吗? 最佳答案 基本上,任何使用中介的解决方案都是代理。
我已经让应用程序在 textview 中显示收件箱中当前的所有短信。为了做到这一点,我必须包含 URI。我正在尝试测试我拥有但未通过我的移动运营商(版本)注册的其他手机,因为它们不支持我拥有的手机,因
需要您的帮助来为 Selenium 中的 findElements 方法找到正确的 XPath。详情如下: 网址 - http://www.cleartrip.com/hotels/info/hote
我正在努力掌握我的 xPath 发现,但我遇到了一个问题。我的目标是从表中获取复选框。您能给我一些建议,应该如何始终设置定位器吗? 假设我的目标是指向需要单击的复选框 的input。 首先我尝试了非常
我正在尝试使用 Spring Data Gemfire 设置 Gemfire 集群。 我可以通过 gfsh 启动一个定位器,我可以通过 Spring 启动一个服务器。 问题是,我找不到通过 Sprin
我正在使用基于模型的表单,我的表单如下所示: Submit 我想写一个 Protractor 规范来测试登录。我喜欢在我的规范中做类似下面的事情: element(by.f
有没有一种优雅的方式来获取我已经找到/识别的 Selenium WebElement 的 By 定位器? 要明确这个问题:我希望使用“按定位器”来查找元素。在这种情况下,我不对特定属性或特定定位器(如
我是一名优秀的程序员,十分优秀!