Ich bin ein wenig verwirrt darüber, wie Service-Locator zu vermeiden, wenn eine Konsolenanwendungasp.net Kerndienst-Locator, wie in cosole Anwendung zu vermeiden
Programm
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>();
}
CommandLineOptions mit
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;
});
Ich muss das IExampleRepository in das neue injizieren Task1()
task1
public class Task1
{
public Task1()
{
}
private readonly IExampleRepository _exampleRepository;
public Task1(IExampleRepository exampleRepository)
{
_exampleRepository = exampleRepository;
}
public void Process() {
....
}
Also im Grunde mein Verständnis ist, dass ich meine Abhängigkeiten registrieren, dann sollte ich in der Lage sein, sie während meiner Klassen zu injizieren. Ich bin mir nicht sicher, ob ich meinen ServiceProvider übergeben muss?
Ich glaube, dass es in MVC Magie gibt, die geschieht, um dies zu erreichen. Wie würde ich beim Injizieren vorgehen, ohne das Service-Locator-Muster zu verwenden?
Vielen Dank für Ihre gründliche Erklärung, wäre zu viel Mühe, um ein kleines Beispiel für die Fabrik Implementierung zu fragen? Ich neige dazu, besser Beispiele zu lernen. Ich habe mir das angeschaut: http://stackoverflow.com/questions/557742/dependency-injection-vs-factory-pattern – DotnetShadow
Zwei Beispiele für Factory-Methode bzw. Factory-Klasse hinzugefügt. – Tseng
Schätze deine Bemühungen :) – DotnetShadow