WinForm लोगन सर्वश्रेष्ठ अभ्यास
मेरे पास WinForms Project के लिए एक कार्यशील लॉगऑन है। मैं 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 है जिसे आपके कोड में कहीं भी, किसी द्वारा भी सेट किया जा सकता है। आपने इस संपत्ति के उपयोग का विवरण नहीं दिया है।
यदि यह लॉगऑन फॉर्म है जिसे इसे अपडेट करना चाहिए और यह फिर कभी अपडेट नहीं होगा, तो अपने प्रोग्राम क्लास को इस फ़ील्ड को सेट करें।
यदि यह एक और वर्ग है जो इस क्षेत्र को अपडेट करता है, तो शायद यह संपत्ति यहां नहीं है।
आपके पास कुछ कोड हैं जो डुप्लिकेट हैं, इसलिए बेहतर करने का एक तरीका होना चाहिए।
मेरे दृष्टिकोण से, आप अपने मुख्य तरीके में कई अलग-अलग चीजें कर रहे हैं, हो सकता है कि आप इन कार्यों को अलग-अलग तरीकों से डाल सकें: Init, Login, Start।
का उपयोग कर
आपने मुख्य संपत्ति के लिए प्रस्तुतकर्ता को टैग संपत्ति में रखा है, जो मुझे लगता है कि एक विशिष्ट संपत्ति से संबंधित है। इस तरह से MainForm नियंत्रित कर सकता है कि इसकी पहुंच किसके पास है, अन्यथा MainForm तक पहुंच रखने वाली किसी भी वस्तु को टैग और इसलिए प्रस्तुतकर्ता पुनर्प्राप्त कर सकता है। एक अन्य समस्या यह है कि टैग संपत्ति एक वस्तु है, इसलिए आपको इसे हर बार जब आप इसका उपयोग करना चाहते हैं, तो इसे बदलना होगा।
तो, सभी मिलकर बनेंगे:
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);
}
}