1. 程式人生 > 其它 >.net core 控制檯專案中使用依賴注入和配置檔案

.net core 控制檯專案中使用依賴注入和配置檔案

之前想要新建一個控制檯專案,用來除錯.net core Web專案,因為每次啟動web專案去測試service層的程式碼太麻煩了,但是控制檯專案又沒有依賴注入也沒有配置檔案,只能自己載入了,以下是步驟及程式碼

  • 首先新建一個控制檯專案,以下是主要程式碼,需要從nuget上下載如下類庫 Microsoft.Extensions.Hosting Microsoft.Extensions.Configuration Microsoft.Extensions.DependencyInjection
  class Program
    {
        private static  IFoo _fooService;
        private static IConfiguration _configuration;

        static async Task Main(string[] args)
        {
            using IHost host = CreateHostBuilder(args).Build();
            
            using(var provider = host.Services.CreateScope())
            {
                _fooService = provider.ServiceProvider.GetService<IFoo>();
                _configuration = provider.ServiceProvider.GetService<IConfiguration>();
            }
            var connectionString = _configuration.GetConnectionString("default");

            Console.WriteLine(_fooService.Bar());

            SQLTest();
            Console.ReadKey();

            await host.RunAsync();
        }


        private static void SQLTest()
        {
            string connectionStr = _configuration.GetConnectionString("default");
            SqlConnection conn = new SqlConnection(connectionStr);
            conn.Open();
            var connState = conn.State;
            Console.WriteLine($"資料庫狀態:{(connState == System.Data.ConnectionState.Open ? "已開啟" : "未開啟")}");
            conn.Close();
           

        }

        static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureAppConfiguration((hostingContext,config) =>
                {
                    config.SetBasePath(GetApplicationRoot());
                    config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
                    
                })
                .ConfigureServices(services =>
                {
                    services.AddScoped<IFoo, Foo>();
                })
        ;

        static string GetApplicationRoot()
        {
            //此處獲取的是執行檔案目錄(bin目錄),我們配置檔案一般是放在專案的根目錄下,
            //所以此處使用正則匹配一下,如果您有更好的方式,歡迎留言告知
            var exePath = Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory);
            Regex appPathMatcher = new Regex(@"(?<!fil)[A-Za-z]:\\+[\S\s]*?(?=\\+bin)");
            var appRoot = appPathMatcher.Match(exePath).Value;
            return appRoot;
        }
    }
  • appsettings.json 檔案
  {
    "ConnectionStrings": {
      "default": "server=.;database=ReportServer;uid=sa;pwd=123456"

    }
  }
  • IFoo.cs 檔案
  public interface IFoo
  {
     string Bar();
  }
  • Foo.cs 檔案
  public class Foo: IFoo
    {
        public string Bar()
        {
            return "Get Success";
        }
    }
  • 最終結果,配置檔案正常載入,介面正常注入