แนวทางปฏิบัติที่ดีที่สุดสำหรับการเข้าสู่ระบบ WinForm
ฉันมีล็อกออนที่ใช้งานได้สำหรับโครงการ 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);
}
}
}
ข้อเสนอแนะหรือความคิดเห็นใด ๆ ยินดีต้อนรับ
คำตอบ
- คุณมี UserName คุณสมบัติคงที่สาธารณะซึ่งทุกคนสามารถตั้งค่าได้ทุกที่ในรหัสของคุณ คุณไม่ได้ให้รายละเอียดการใช้พร็อพเพอร์ตี้นี้
หากเป็นแบบฟอร์มการเข้าสู่ระบบที่ควรอัปเดตและจะไม่อัปเดตอีกให้คลาส Program ของคุณตั้งค่าฟิลด์นี้
หากเป็นคลาสอื่นที่อัปเดตฟิลด์นี้คุณสมบัตินี้อาจไม่ได้อยู่ที่นี่
คุณมีรหัสที่ซ้ำกันดังนั้นจึงต้องมีวิธีที่ดีกว่านี้
จากมุมมองของฉันคุณกำลังทำสิ่งต่างๆมากมายในวิธีการหลักของคุณบางทีคุณอาจวางการดำเนินการเหล่านี้ในวิธีการแยกกัน: Init, Login, Start
ใช้โดยใช้
คุณใส่ 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);
}
}
}
}
สิ่งแรกที่ฉันสังเกตเห็น การทำสำเนารหัส เมื่อใดก็ตามที่คุณเห็นสิ่งนี้ความคิดแรกของคุณควรเป็น "มันต้องมีวิธีที่ดีกว่านี้"
ในกรณีนี้กำหนดตัวแปรผลลัพธ์ให้DialogResult.None
จากนั้นแสดงกล่องโต้ตอบภายในลูป:
var result = DialogResult.None;
while(result != DialogResult.OK)
{
result = loginForm.ShowDialog();
if(result == DialogResult.Cancel)
{
System.Environment.Exit(1);
}
}