WinForm Oturum Açma En İyi Uygulamaları

Aug 17 2020

WinForms Projesi için çalışan bir oturum açmam var. Kullandığım program.csgiriş formunu başlatmak için dosyayı. Bunu uygulamanın daha iyi bir yolu olmadığından pek emin değilim.

Program.cs dosyam:

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

Herhangi bir öneri veya yorum bekliyoruz.

Yanıtlar

4 MartinVerjans Aug 17 2020 at 16:18
  1. Kodunuzun herhangi bir yerinde, herkes tarafından ayarlanabilen UserName genel statik özelliğiniz var. Bu mülkün kullanımıyla ilgili ayrıntı vermediniz.
  • Güncellenmesi gereken oturum açma formuysa ve bir daha asla güncellenmeyecekse, Program sınıfınızın bu alanı ayarlamasını sağlayın.

  • Bu alanı güncelleyen başka bir sınıfsa, bu özellik buraya ait olmayabilir.

  1. Yinelenen bir kodunuz var, bu yüzden daha iyisini yapmanın bir yolu olmalı.

  2. Benim açımdan, Ana yönteminizde birçok farklı şey yapıyorsunuz, belki bu işlemleri ayrı yöntemlere koyabilirsiniz: Init, Login, Start.

  3. Kullanarak kullanın

  4. MainForm için Sunucuyu, belirli bir özelliğe ait olduğunu düşündüğüm Etiket Özelliğine koydunuz. Bu şekilde, MainForm ona kimlerin erişebileceğini kontrol edebilir, aksi takdirde MainForm'a erişimi olan herhangi bir nesne Etiketi ve dolayısıyla Sunucuyu kurtarabilir. Diğer bir sorun, Tag özelliğinin bir nesne olmasıdır, bu yüzden onu her kullanmak istediğinizde onu dönüştürmeniz gerekecektir.

Yani, hep birlikte bu şu hale gelecektir:

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

İlk fark ettiğim şey. Kod çoğaltma. Bunu her gördüğünüzde ilk düşünceniz "Daha iyi bir yol olmalı." Olmalıdır.

Bu durumda sonuç değişkenini atayın ve DialogResult.Noneardından diyaloğu döngü içinde gösterin:

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