2016-02-02 3 views
1

я делаю что-то вроде:Как вы используете инъекцию зависимостей в консольном приложении asp.net?

 private static IServiceProvider serviceProvider; 

    public Program(IApplicationEnvironment env, IRuntimeEnvironment runtime) 
    { 
     var services = new ServiceCollection(); 
     ConfigureServices(services); 
     serviceProvider = services.BuildServiceProvider(); 

     // Set up configuration sources. 
     var builder = new ConfigurationBuilder() 
      .AddJsonFile("appsettings.json") 
      .AddEnvironmentVariables(); 

     Configuration = builder.Build(); 
    } 
    public IConfigurationRoot Configuration { get; set; } 

    private void ConfigureServices(IServiceCollection services) 
    { 
     //Console.WriteLine(Configuration["Data:DefaultConnection:ConnectionString"]); 

     services.AddEntityFramework() 
      .AddSqlServer() 
      .AddDbContext<DbContext>(options => 
       options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"])); 
    } 

Я изо всех сил, чтобы использовать программу, используя впрыскивается DbContext. Есть идеи? Как вы создаете экземпляр программы и получаете все инъекции? Я не знаю, что делать в статическом методе Main.

Есть ли эквивалент для этого?

public static void Main(string[] args) => WebApplication.Run<Startup>(args); 

Что-то вроде?

public static void Main(string[] args) => ConsoleApplication.Run<Program>(args); 
+0

Пожалуйста, простите мое любопытство и, пожалуйста, простите меня за отсутствие ответа, но я хочу знать. Почему вы создаете консольное приложение asp.net? – gpersell

+0

Я хочу создать WebJob, и я хочу легко получить доступ ко всем материалам, которые я сделал для основного WebApp и Backend. – user2715109

+0

Я искал stackoverflow со следующим текстом и нашел ответ или два ответа, которые могли бы дать вам ответ: вложение зависимостей в консоли asp.net – gpersell

ответ

0

Это, как я это сделал:

public class Startup 
{ 
    public static IConfigurationRoot Configuration { get; set; } 

    public static void ConfigureServices(IServiceCollection services) 
    { 
     services.AddEntityFramework() 
      .AddSqlServer() 
      .AddDbContext<DbContext>(options => 
       options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"])); 

     services.AddSingleton<IMyManager, Manager>(); 
     services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); 
     services.AddSingleton<Program, Program>(); 
    } 

    public static void Main(string[] args) 
    { 
     var services = new ServiceCollection(); 
     var builder = new ConfigurationBuilder() 
      .AddJsonFile("appsettings.json"); 
      .AddEnvironmentVariables() 
      .AddUserSecrets(); 
     Configuration = builder.Build(); 
     ConfigureServices(services); 
     var provider = services.BuildServiceProvider(); 

     CancellationTokenSource ctSource = new CancellationTokenSource(); 
     CancellationToken ct = ctSource.Token; 

     Task task = Task.Run(async() => 
     { 
      Program program = provider.GetRequiredService<Program>(); 
      await program.Run(ct); 
     }); 
     try 
     { 
      task.Wait(); 
     } 
     catch (AggregateException e) 
     { 
      throw e.InnerException; 
     } 
     ctSource.Cancel(); 
     ctSource.Dispose(); 
    } 
} 

Тогда программа просто:

class Program 
{ 
    private IMyManager _myManager; 

    public Program(IMyManager myManager) 
    { 
     _myManager = myManager; 
    } 

    public async Task Run(CancellationToken cancelationToken) 
    { 
     while (true) 
     { 
      cancelationToken.ThrowIfCancellationRequested(); 

      // My things using _myManager 

      await Task.Delay(10000, cancelationToken); 
     } 
    } 
} 

Я удалил кучу вещей для примера, так что, вероятно, падает где-то, но вы получаете идею.