첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
728x90
반응형
728x170

TestProject.zip
다운로드

▶ Models/Configuration.cs

namespace TestProject.Models
{
    /// <summary>
    /// 구성
    /// </summary>
    public class Configuration
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Property
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region ID - ID

        /// <summary>
        /// ID
        /// </summary>
        public string ID { get; set; }

        #endregion
        #region 값 - Value

        /// <summary>
        /// 값
        /// </summary>
        public string Value { get; set; }

        #endregion
    }
}

 

728x90

 

▶ Data/DatabaseContext.cs

using Microsoft.EntityFrameworkCore;

using TestProject.Models;

namespace TestProject.Data
{
    /// <summary>
    /// 데이터베이스 
    /// </summary>
    public class DatabaseContext : DbContext
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Property
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 구성 - Configuration

        /// <summary>
        /// 구성
        /// </summary>
        public DbSet<Configuration> Configuration { get; set; }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 생성자 - DatabaseContext(options)

        /// <summary>
        /// 생성자
        /// </summary>
        /// <param name="options">옵션</param>
        public DatabaseContext(DbContextOptions options) : base(options)
        {
        }

        #endregion
    }
}

 

300x250

 

▶ CustomConfigurationProvider.cs

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using System;
using System.Collections.Generic;
using System.Linq;

using TestProject.Data;
using TestProject.Models;

namespace TestProject
{
    /// <summary>
    /// 커스텀 구성 공급자
    /// </summary>
    public class CustomConfigurationProvider : ConfigurationProvider
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Property
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 옵션 액션 - OptionsAction

        /// <summary>
        /// 옵션 액션
        /// </summary>
        Action<DbContextOptionsBuilder> OptionsAction { get; }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 생성자 - CustomConfigurationProvider(optionsAction)

        /// <summary>
        /// 생성자
        /// </summary>
        /// <param name="optionsAction"></param>
        public CustomConfigurationProvider(Action<DbContextOptionsBuilder> optionsAction)
        {
            OptionsAction = optionsAction;
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 로드하기 - Load()

        /// <summary>
        /// 로드하기
        /// </summary>
        public override void Load()
        {
            DbContextOptionsBuilder<DatabaseContext> builder = new DbContextOptionsBuilder<DatabaseContext>();

            OptionsAction(builder);

            using(DatabaseContext context = new DatabaseContext(builder.Options))
            {
                context.Database.EnsureCreated();

                if(!context.Configuration.Any())
                {
                    Data = CreateData(context);
                }
                else
                {
                    Data = context.Configuration.ToDictionary
                    (
                        configuration => configuration.ID,
                        configuration => configuration.Value
                    );
                }
            }
        }

        #endregion

        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region 데이터 생성하기 - CreateData(context)

        /// <summary>
        /// 데이터 생성하기
        /// </summary>
        /// <param name="context">데이터베이스 컨텍스트</param>
        /// <returns>데이터</returns>
        private static IDictionary<string, string> CreateData(DatabaseContext context)
        {
            Dictionary<string, string> sourceDictionary = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
            {
                { "Key1", "Value1" },
                { "Key2", "Value2" },
                { "Key3", "Value3" }
            };

            context.Configuration.AddRange
            (
                sourceDictionary.Select
                (
                    keyValuePair => new Configuration 
                    {
                        ID    = keyValuePair.Key,
                        Value = keyValuePair.Value
                    }
                )
                .ToArray()
            );

            context.SaveChanges();

            return sourceDictionary;
        }

        #endregion
    }
}

 

▶ CustomConfigurationSource.cs

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using System;

namespace TestProject
{
    /// <summary>
    /// 커스텀 구성 소스
    /// </summary>
    public class CustomConfigurationSource : IConfigurationSource
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Field
        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region Field

        /// <summary>
        /// 옵션 액션
        /// </summary>
        private readonly Action<DbContextOptionsBuilder> optionsAction;

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 생성자 - CustomConfigurationSource(optionsAction)

        /// <summary>
        /// 생성자
        /// </summary>
        /// <param name="optionsAction">옵션 액션</param>
        public CustomConfigurationSource(Action<DbContextOptionsBuilder> optionsAction)
        {
            this.optionsAction = optionsAction;
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 빌드하기 - Build(builder)

        /// <summary>
        /// 빌드하기
        /// </summary>
        /// <param name="builder">빌더</param>
        /// <returns>구성 공급자</returns>
        public IConfigurationProvider Build(IConfigurationBuilder builder)
        {
            return new CustomConfigurationProvider(this.optionsAction);
        }

        #endregion
    }
}

 

▶ CustomExtension.cs

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using System;

namespace TestProject
{
    /// <summary>
    /// 커스텀  확장
    /// </summary>
    public static class CustomExtension
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Static
        //////////////////////////////////////////////////////////////////////////////// Public

        #region EF 구성 추가하기 - AddEFConfiguration(builder, optionsAction)

        /// <summary>
        /// EF 구성 추가하기
        /// </summary>
        /// <param name="builder">빌더</param>
        /// <param name="optionsAction">옵션 액션</param>
        /// <returns>구성 빌더</returns>
        public static IConfigurationBuilder AddEFConfiguration
        (
            this IConfigurationBuilder      builder,
            Action<DbContextOptionsBuilder> optionsAction
        )
        {
            return builder.Add(new CustomConfigurationSource(optionsAction));
        }

        #endregion
    }
}

 

▶ appsettings.json

{
    "Logging" :
    {
        "LogLevel" :
        {
            "Default"                    : "Information",
            "Microsoft"                  : "Warning",
            "Microsoft.Hosting.Lifetime" : "Information"
        }
    },
    "AllowedHosts" : "*",
    "ConnectionStrings" :
    {
        "DefaultConnection" : "Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=TestDB;Integrated Security=True;"
    }
}

 

▶ Program.cs

using Microsoft.AspNetCore.Hosting;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;

namespace TestProject
{
    /// <summary>
    /// 프로그램
    /// </summary>
    public class Program
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Static
        //////////////////////////////////////////////////////////////////////////////// Public

        #region 프로그램 시작하기 - Main(argumentArray)

        /// <summary>
        /// 프로그램 시작하기
        /// </summary>
        /// <param name="argumentArray">인자 배열</param>
        public static void Main(string[] argumentArray)
        {
            CreateHostBuilder(argumentArray).Build().Run();
        }

        #endregion
        #region 호스트 빌더 생성하기 - CreateHostBuilder(argumentArray)

        /// <summary>
        /// 호스트 빌더 생성하기
        /// </summary>
        /// <param name="argumentArray">인자 배열</param>
        /// <returns>호스트 빌더</returns>
        public static IHostBuilder CreateHostBuilder(string[] argumentArray) =>
            Host.CreateDefaultBuilder(argumentArray)
                .ConfigureAppConfiguration
                (
                    (context, builder) =>
                    {
                        var root = builder.AddJsonFile("appsettings.json", optional : true, reloadOnChange : true).Build();
                   
                        string connectionString = root.GetConnectionString("DefaultConnection");

                        builder.AddEFConfiguration(options => options.UseSqlServer(connectionString));
                    }
                )
                .ConfigureWebHostDefaults
                (
                    builder =>
                    {
                        builder.UseStartup<Startup>();
                    }
                );

        #endregion
    }
}

 

▶ Controllers/TestController.cs

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using System.Text;

namespace TestProject.Controllers
{
    /// <summary>
    /// 테스트 컨트롤러
    /// </summary>
    public class TestController : Controller
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Field
        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region Field

        /// <summary>
        /// 구성
        /// </summary>
        private IConfiguration configuration;

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 생성자 - TestController(configuration)

        /// <summary>
        /// 생성자
        /// </summary>
        /// <param name="configuration">구성</param>
        public TestController(IConfiguration configuration)
        {
            this.configuration = configuration;
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 인덱스 페이지 처리하기 - Index()

        /// <summary>
        /// 인덱스 페이지 처리하기
        /// </summary>
        /// <returns>액션 결과</returns>
        public IActionResult Index()
        {
            string value1 = this.configuration["Key1"];
            string value2 = this.configuration["Key2"];
            string value3 = this.configuration["Key3"];

            StringBuilder stringBuilder = new StringBuilder();

            stringBuilder.AppendLine($"Key1 : {value1}");
            stringBuilder.AppendLine($"Key2 : {value2}");
            stringBuilder.AppendLine($"Key3 : {value3}");

            return Content(stringBuilder.ToString());
        }

        #endregion
    }
}
728x90
반응형
그리드형(광고전용)
Posted by icodebroker

댓글을 달아 주세요