2016-12-31 15 views
20

Kendime ait bir .NET Çekirdek Konsol Uygulaması'a sahibim.Kendinden barındırılan bir .NET Çekirdek Konsol Uygulamasında Startup.cs

Web, ASP.NET Core için örnekleri gösterir, ancak web sunucusuna sahip değilim. Sadece basit bir komut satırı uygulaması.

Konsol uygulamaları için böyle bir şey yapmak mümkün mü?

public static void Main(string[] args) 
{ 
    // I don't want a WebHostBuilder. Just a command line 

    var host = new WebHostBuilder() 
     .UseKestrel() 
     .UseContentRoot(Directory.GetCurrentDirectory()) 
     .UseIISIntegration() 
     .UseStartup<Startup>() 
     .Build(); 

    host.Run(); 
} 

ASP.NET Core'da olduğu gibi bir konsolda da Startup.cs kullanmak istiyorum.

Bu nasıl?

+0

? Web sayfalarına hizmet edebilecek bir konsol uygulaması? Evet, "kendi kendine yeten bir asp.net çekirdek uygulaması" olurdu ve birkaç örnek var, örn. http://druss.co/2016/08/deploy-and-run-net-core-application-without-installed-runtime-self-contained-applications/ –

+0

@ArashMotamedi ASP.NET Uygulamasını barındırmak istemiyorum . Sınıf Kütüphane projemi başlatan eski bir Konsol Uygulamasına sahip olmak istiyorum. Ben Bağımlılık Enjeksiyon vb. Ücretsiz alacağını düşündüm. – Daniel

+0

Anladım. Ama evet, yaklaşımın biraz geriye doğru. Tüm .net çekirdek uygulamalarının bağımsız kütüphanelerden oluştuğunu ve herhangi bir proje türü için bu kütüphanelerden herhangi birine başvurmaktan kesinlikle bağımsız olduğunu unutmayın. Sadece bir Asp.net çekirdek uygulamasının, bu kütüphanelerin çoğuna referans vermek ve bir http son noktasını ortaya çıkarmak için önceden yapılandırılmış olarak gelir. Ancak konsol uygulamanız için ihtiyacınız olan Bağımlılık Enjeksiyonu ise, sadece uygun kütüphaneye başvurmanız yeterlidir. İşte bir rehber: http://andrewlock.net/using-dependency-injection-in-a-net-core-console-application/ –

cevap

9

Tüm .NET Core uygulamaları, her tür başvuruda referans ve kullanımda özgür olduğunuz, iyi hazırlanmış bağımsız kitaplıklar ve paketlerden oluşur. Öyle ki, bir Asp.net core uygulamasının bu kütüphanelerin çoğuna referans vermek için önceden yapılandırılmış olması ve bir http son noktasını ortaya koymasıdır.

Ancak Konsol uygulamanız için Bağımlılık Enjeksiyonu gerekiyorsa, ilgili kitaplığa başvurmanız yeterlidir. Yani bu çözüm ile karşılaştım http://andrewlock.net/using-dependency-injection-in-a-net-core-console-application/

-3

Evet, öyle. ASP.NET Çekirdek uygulamaları, kendi örneğinizde olabilir - örneğinizde olduğu gibi - veya IIS gibi bir web sunucusunda barındırılır. .NET Core'da tüm uygulamalar konsol uygulamalarıdır.

+0

, kendiminkine benzer bir senaryoda. Bir Startup.cs'i nasıl bağlarım? – Daniel

+0

Yani konsol uygulamamı başlatmak için sadece bir web sunucusunu çalıştırır mıyım? – Daniel

24

, kabul edilen yanıt esinlenerek:

program.cs

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     IServiceCollection services = new ServiceCollection(); 
     // Startup.cs finally :) 
     Startup startup = new Startup(); 
     startup.ConfigureServices(services); 
     IServiceProvider serviceProvider = services.BuildServiceProvider(); 

     //configure console logging 
     serviceProvider 
      .GetService<ILoggerFactory>() 
      .AddConsole(LogLevel.Debug); 

     var logger = serviceProvider.GetService<ILoggerFactory>() 
      .CreateLogger<Program>(); 

     logger.LogDebug("Logger is working!"); 

     // Get Service and call method 
     var service = serviceProvider.GetService<IMyService>(); 
     service.MyServiceMethod(); 
    } 
} 

Startup.cs

public class Startup 
{ 
    IConfigurationRoot Configuration { get; } 

    public Startup() 
    { 
     var builder = new ConfigurationBuilder() 
      .AddJsonFile("appsettings.json"); 

     Configuration = builder.Build(); 
    } 

    public void ConfigureServices(IServiceCollection services) 
    { 
     services.AddLogging(); 
     services.AddSingleton<IConfigurationRoot>(Configuration); 
     services.AddSingleton<IMyService, MyService>(); 
    } 
} 

appsettings.json İşte bir kılavuz

{ 
    "SomeConfigItem": { 
     "Token": "8201342s223u2uj328", 
     "BaseUrl": "http://localhost:5000" 
    } 
} 
Eğer başarmak için çalışıyoruz ne

MyService.cs

public class MyService : IMyService 
{ 
    private readonly string _baseUrl; 
    private readonly string _token; 
    private readonly ILogger<MyService> _logger; 

    public MyService(ILoggerFactory loggerFactory, IConfigurationRoot config) 
    { 
     var baseUrl = config["SomeConfigItem:BaseUrl"]; 
     var token = config["SomeConfigItem:Token"]; 

     _baseUrl = baseUrl; 
     _token = token; 
     _logger = loggerFactory.CreateLogger<MyService>(); 
    } 

    public async Task MyServiceMethod() 
    { 
     _logger.LogDebug(_baseUrl); 
     _logger.LogDebug(_token); 
    } 
} 

IMyService.cs

public interface IMyService 
{ 
    Task MyServiceMethod(); 
} 
+1

Bu çok yardımcı oldu. Uygulamanız ASP.NET Core MVC kullanıyorsa (denetleyicileriniz yalın ve görünümleriniz uygulama mantığına sahip olmadıkça) bile çalışır. Yapmam gereken tek şey, MyHostingEnvironment adlı Microsoft.AspNetCore.Hosting.Internal.HostingEnvironment alt sınıfımı oluşturmak ve ContentRootPath = Path.GetFullPath ("."); ve sonra Program.cs'de yeni Başlangıç ​​çağrılmadan önce IHostingEnvironment env = new MyHostingEnvironment(); services.AddSingleton (); ve sonra "yeni Başlangıç ​​()" ı "yeni Başlangıç ​​(env)" olarak değiştirin. – Demerit

+0

Mükemmel cevap! Paylaştığın için çok teşekkür ederim. Sadece WebHost'un sağladığı bazı şeylere ihtiyacım vardı ve bu kesinlikle bir çekicilik gibi çalışıyor. Dürüst olmak gerekirse VS bir şablon olmalı, en yararlı olurdu çünkü sadece WebHosting olmadan bir minyatür VPS Linux host üzerinde çalıştırmak için benim app gerekir. – ppumkin

İlgili konular