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이 있습니다. 이 속성의 사용법을 자세히 설명하지 않았습니다.
업데이트해야하는 로그온 양식이고 다시 업데이트되지 않는 경우 프로그램 클래스가이 필드를 설정하도록합니다.
이 필드를 업데이트하는 다른 클래스 인 경우이 속성이 여기에 속하지 않을 수 있습니다.
중복 된 코드가 있으므로 더 나은 방법이 있어야합니다.
내 관점에서 볼 때 Main 메서드에서 여러 가지 작업을 수행하고 있으며 이러한 작업을 Init, Login, Start와 같은 별도의 메서드에 넣을 수 있습니다.
사용하여
MainForm의 Presenter를 특정 속성에 속하는 Tag 속성에 넣었습니다. 이렇게하면 MainForm이 누가 액세스 할 수 있는지 제어 할 수 있습니다. 그렇지 않으면 MainForm에 대한 액세스 권한이있는 모든 개체가 Tag와 Presenter를 복구 할 수 있습니다. 또 다른 문제는 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);
}
}