2016-12-31 3 views
20

У меня есть самодостаточное приложение .NET Core Console.Startup.cs в самообслуживании .NET Core Console Application

Веб показывает примеры для ASP.NET Core, но у меня нет веб-сервера. Просто простое приложение командной строки.

Возможно ли сделать что-то подобное для консольных приложений?

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(); 
} 

Я хотел бы использовать Startup.cs как в ASP.NET Core, но на консоли.

Как это сделать?

+0

Что вы пытаетесь достичь? Консольное приложение, которое может обслуживать веб-страницы? Да, это будет «автономное основное приложение asp.net», и есть несколько доступных примеров. http://druss.co/2016/08/deploy-and-run-net-core-application-without-installed-runtime-self-contained-applications/ –

+0

@ArashMotamedi Я не хочу размещать приложение ASP.NET , Я хочу иметь хорошее старое консольное приложение, которое запускает проект моей библиотеки классов. Я думал, что я получу Injection Dependency и т. Д. Бесплатно. – Daniel

+0

Получил это. Но да, ваш подход немного назад. Помните, что все основные приложения .net состоят из независимых библиотек, и вы, безусловно, можете ссылаться на любую из этих библиотек для любого типа проекта. Так получилось, что основное приложение Asp.net поставляется предварительно сконфигурированным для ссылки на многие из этих библиотек и предоставляет конечную точку http. Но если это требуется для приложения Infusion Injection для консольного приложения, просто обратитесь к соответствующей библиотеке. Вот руководство: http://andrewlock.net/using-dependency-injection-in-a-net-core-console-application/ –

ответ

9

Все приложения .NET Core состоят из хорошо разработанных независимых библиотек и пакетов, которые вы можете свободно ссылаться и использовать в любом типе приложений. Так получилось, что приложение Asp.net core поставляется предварительно сконфигурированным для ссылки на многие из этих библиотек и предоставляет конечную точку http.

Но если это требуется для инъекций для вашего консольного приложения, просто обратитесь к соответствующей библиотеке. Вот руководство: http://andrewlock.net/using-dependency-injection-in-a-net-core-console-application/

-3

Да, это так. Основные приложения ASP.NET могут быть либо самомодными - как в вашем примере, либо размещаться внутри веб-сервера, например IIS. В .NET Core все приложения - консольные приложения.

+0

в самодельном сценарии вроде моего. Как я могу подключить Startup.cs? – Daniel

+0

Вы хотите, чтобы я запускал веб-сервер, чтобы запустить консольное приложение? – Daniel

24

Так я наткнулся с этим решением, вдохновленные принято отвечать:

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

{ 
    "SomeConfigItem": { 
     "Token": "8201342s223u2uj328", 
     "BaseUrl": "http://localhost:5000" 
    } 
} 

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

Это было очень полезно. Это даже работает, если ваше приложение использует ASP.NET Core MVC (до тех пор, пока ваши контроллеры худые, а ваши представления не имеют в них логики приложений). Единственное, что мне нужно было сделать, это создать собственный подкласс Microsoft.AspNetCore.Hosting.Internal.HostingEnvironment, называемый MyHostingEnvironment, и установить его ContentRootPath = Path.GetFullPath ("."); а затем перед вызовом нового запуска в Program.cs do IHostingEnvironment env = new MyHostingEnvironment(); services.AddSingleton (); а затем измените «новый запуск()» на «новый запуск (env)». – Demerit

+0

Отличный ответ! Спасибо вам большое за обмен. Я просто нуждался в некоторых вещах, которые предоставляет WebHost, и это определенно работает как шарм. Это должен быть шаблон в VS, чтобы быть честным, это было бы очень полезно, потому что мне просто нужно, чтобы мое приложение запускалось на миниатюрном хосте VPS Linux без WebHosting. – ppumkin