WinForm 로그온 모범 사례

Aug 17 2020

WinForms 프로젝트에 대한 로그온이 있습니다. 이 program.cs파일을 사용하여 로그인 양식을 시작합니다. 이것을 구현하는 더 좋은 방법이 있는지 잘 모르겠습니다.

내 program.cs 파일은 다음과 같습니다.

    using System;
    using System.Windows.Forms;
    using WindowsFormsApp.Presenters;
    using WindowsFormsApp.Views;
    using Autofac;
    using DbContexts;
    using Serilog;

    namespace WindowsFormsApp
    {
        internal static class Program
        {
            public static IContainer Container { get; private set; }
            public static string UserName { get; set; }

            /// <summary>
            /// The main entry point for the application.
            /// </summary>
            [STAThread]
            private static void Main()
            {
                var builder = new ContainerBuilder();

                builder.Register(c => new MyContext());
            
                Container = builder.Build();

                Log.Logger = new LoggerConfiguration()
                    .MinimumLevel.Debug()
                    .WriteTo.Console()
                    .WriteTo.RollingFile("log-{Date}.txt")
                    .CreateLogger();
                Log.Information("Application Started");

                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);

                var loginForm = new LoginForm();
                var results = loginForm.ShowDialog();

                if (results == DialogResult.Cancel)
                    System.Environment.Exit(1);

                while (results != DialogResult.OK)
                {
                    results = loginForm.ShowDialog();
                    if (results == DialogResult.Cancel)
                        System.Environment.Exit(1);
                }

                var mainFormView = new MainFormView();

                mainFormView.Tag = new MainFormPresenter(mainFormView);

                Application.Run(mainFormView);
            }
        }
    }

모든 제안이나 의견을 환영합니다.

답변

4 MartinVerjans Aug 17 2020 at 16:18
  1. 코드의 어느 곳에서나 누구나 설정할 수있는 공용 정적 속성 UserName이 있습니다. 이 속성의 사용법을 자세히 설명하지 않았습니다.
  • 업데이트해야하는 로그온 양식이고 다시 업데이트되지 않는 경우 프로그램 클래스가이 필드를 설정하도록합니다.

  • 이 필드를 업데이트하는 다른 클래스 인 경우이 속성이 여기에 속하지 않을 수 있습니다.

  1. 중복 된 코드가 있으므로 더 나은 방법이 있어야합니다.

  2. 내 관점에서 볼 때 Main 메서드에서 여러 가지 작업을 수행하고 있으며 이러한 작업을 Init, Login, Start와 같은 별도의 메서드에 넣을 수 있습니다.

  3. 사용하여

  4. MainForm의 Presenter를 특정 속성에 속하는 Tag 속성에 넣었습니다. 이렇게하면 MainForm이 누가 액세스 할 수 있는지 제어 할 수 있습니다. 그렇지 않으면 MainForm에 대한 액세스 권한이있는 모든 개체가 Tag와 Presenter를 복구 할 수 있습니다. 또 다른 문제는 Tag 속성이 객체이므로 사용할 때마다 변환해야한다는 것입니다.

따라서 모두 함께하면 다음과 같습니다.

using System;
using System.Windows.Forms;
using WindowsFormsApp.Presenters;
using WindowsFormsApp.Views;
using Autofac;
using DbContexts;
using Serilog;

namespace WindowsFormsApp
{
    internal static class Program
    {
        public static IContainer Container { get; private set; }
        public static string UserName { get; private set; }

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        private static void Main()
        {
            Init();
            Login();
            Start();
        }

        private void Init()
        {
            var builder = new ContainerBuilder();
            builder.Register(c => new MyContext());            
            Container = builder.Build();

            Log.Logger = new LoggerConfiguration()
                .MinimumLevel.Debug()
                .WriteTo.Console()
                .WriteTo.RollingFile("log-{Date}.txt")
                .CreateLogger();
            Log.Information("Application Started");

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
        }

        private void Login()
        {
            using (loginForm = new LoginForm())
            {
                var results DialogResult.None;
                do
                {
                    results = loginForm.ShowDialog();
                    if (results == DialogResult.Cancel)
                        System.Environment.Exit(1);
                } while (results != DialogResult.OK);
                //Since we logged on correctly, we can update UserName (I guess)
                UserName = loginForm.ValidatedUserName;
            }
        }
 
        private void Start()
        {
            using (var mainFormView = new MainFormView())
            {
                mainFormView.Presenter = new MainFormPresenter(mainFormView);
                Application.Run(mainFormView);
            }
        }
    }
}
2 tinstaafl Aug 17 2020 at 06:45

내가 제일 먼저 알아 차린 것. 코드 복제. 이것을 볼 때마다 첫 번째 생각은 "더 나은 방법이 있어야합니다."

이 경우 결과 변수를 할당 DialogResult.None하여 루프 내부에 대화 상자를 표시합니다.

var result = DialogResult.None;
while(result != DialogResult.OK)
{
    result = loginForm.ShowDialog();
    if(result == DialogResult.Cancel)
    {
        System.Environment.Exit(1);
    }
}