แนวทางปฏิบัติที่ดีที่สุดสำหรับการเข้าสู่ระบบ 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 คุณสมบัติคงที่สาธารณะซึ่งทุกคนสามารถตั้งค่าได้ทุกที่ในรหัสของคุณ คุณไม่ได้ให้รายละเอียดการใช้พร็อพเพอร์ตี้นี้
  • หากเป็นแบบฟอร์มการเข้าสู่ระบบที่ควรอัปเดตและจะไม่อัปเดตอีกให้คลาส Program ของคุณตั้งค่าฟิลด์นี้

  • หากเป็นคลาสอื่นที่อัปเดตฟิลด์นี้คุณสมบัตินี้อาจไม่ได้อยู่ที่นี่

  1. คุณมีรหัสที่ซ้ำกันดังนั้นจึงต้องมีวิธีที่ดีกว่านี้

  2. จากมุมมองของฉันคุณกำลังทำสิ่งต่างๆมากมายในวิธีการหลักของคุณบางทีคุณอาจวางการดำเนินการเหล่านี้ในวิธีการแยกกัน: Init, Login, Start

  3. ใช้โดยใช้

  4. คุณใส่ Presenter สำหรับ MainForm ใน Tag Property ซึ่งฉันคิดว่าเป็นของคุณสมบัติเฉพาะ ด้วยวิธีนี้ MainForm สามารถควบคุมผู้ที่สามารถเข้าถึงได้มิฉะนั้นวัตถุใด ๆ ที่มีการเข้าถึง MainForm จะสามารถกู้คืนแท็กได้และดังนั้นผู้นำเสนอ ปัญหาอีกประการหนึ่งคือคุณสมบัติ 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);
    }
}