Praktik Terbaik WinForm Logon

Aug 17 2020

Saya memiliki logon yang berfungsi untuk Proyek WinForms. Saya menggunakan program.csfile tersebut untuk meluncurkan formulir login. Saya tidak begitu yakin tidak ada cara yang lebih baik untuk menerapkan ini.

Ini file program.cs saya:

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

Setiap saran atau komentar dipersilakan.

Jawaban

4 MartinVerjans Aug 17 2020 at 16:18
  1. Anda memiliki UserName properti statis publik yang dapat disetel oleh siapa saja, di mana saja dalam kode Anda. Anda tidak merinci penggunaan properti ini.
  • Jika formulir logonlah yang harus memperbaruinya dan tidak akan pernah diperbarui lagi, minta kelas Program Anda menyetel bidang ini.

  • Jika kelas lain yang memperbarui bidang ini, mungkin properti ini tidak termasuk di sini.

  1. Anda memiliki beberapa kode yang digandakan, jadi pasti ada cara untuk melakukannya dengan lebih baik.

  2. Dari sudut pandang saya, Anda melakukan banyak hal berbeda dalam metode Utama Anda, mungkin Anda dapat meletakkan operasi ini dalam metode terpisah: Init, Login, Start.

  3. Gunakan menggunakan

  4. Anda meletakkan Presenter untuk MainForm di Tag Properti, yang menurut saya milik properti tertentu. Dengan cara itu MainForm dapat mengontrol siapa yang memiliki akses ke sana, jika tidak, objek apa pun yang memiliki akses ke MainForm dapat memulihkan Tag dan oleh karena itu Presenter. Masalah lainnya adalah bahwa properti Tag adalah sebuah objek, jadi Anda harus mengonversinya setiap kali Anda ingin menggunakannya.

Jadi, semuanya itu akan menjadi:

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

Hal pertama yang saya perhatikan. Duplikasi kode. Kapanpun Anda melihat ini, pikiran pertama Anda seharusnya adalah, "Pasti ada cara yang lebih baik."

Dalam hal ini tetapkan variabel hasil untuk DialogResult.Nonekemudian hanya menampilkan dialog di dalam loop:

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