2016-06-11 2 views
1

예를 들어, WPF 응용 프로그램을 만들고 로깅, 처리되지 않은 예외 처리 등과 같이 각 응용 프로그램에서 사용하는 일부 논리를 추가하려고합니다.이 코드를 사용합니다 (실제 코드는 사용하지 않습니다. 단지 코드 만 사용하십시오). 그건 내 예를 들어 WPF 응용 프로그램에서 뭔가를) 수행합니다App 클래스의 기본 코드를 만드는 방법은 무엇입니까?

public partial class App : Application 
{ 
    protected override void OnStartup(StartupEventArgs e) 
    { 
     AppDomain.CurrentDomain.UnhandledException 
      += new UnhandledExceptionEventHandler(UnhandledExceptionHandler); 

     ServiceInjector.InjectServices(); 

     base.OnStartup(e); 

     MainWindow window = new MainWindow(); 
     window.Show(); 
    } 

    void UnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs args) 
    { 
     var exceptionObj = args.ExceptionObject as Exception; 
     if (exceptionObj == null) 
      exceptionObj = new NotSupportedException(
       "Unhandled exception doesn't derive from System.Exception: " 
       + args.ExceptionObject.ToString()); 

     // TODO: Logging... 

     var messageBox = GetService<IMessageBoxService>(); 
     messageBox.Show(
      exceptionObj.Message, 
      "Unhandled exception.", 
      MessageBoxButton.OK, 
      MessageBoxImage.Exclamation); 

     Environment.Exit(1); 
    } 

    #region Resolve service dependencies members. 

    public TServiceContract GetService<TServiceContract>() 
     where TServiceContract : class 
    { 
     return ServiceContainer.Instance.GetService<TServiceContract>(); 
    } 

    #endregion Resolve service dependencies members. 
} 

내가, OnStartup (UnhandledException의 구독 내부의 코드를 사용하여 주입 서비스를 원하는)를 UnhandledExceptionHandler 자체와 손에 의해 복사 붙여 넣기를하지 않고 내 모든 WPF 애플리케이션에서의 getService 방법 . 가장 좋은 방법은 무엇입니까?

App (파생 된 응용 프로그램)에 대한 기본 클래스에 대해 조금 읽었지만 XAML을 지원하는 App.gics 파일 (App 클래스 선언의 일부)과 같은 많은 단점이있는 것으로 보입니다 Fluent의 구성 요소가 App.xaml의 ResourceDictionary를 통해 참조를 추가하지 않고서는 작동하지 않기 때문에 App.xaml을 가짐)

+0

바퀴를 다시 열면 결과에 매우 고통스러운 모서리가됩니다. try/catch 및 writeng 파일 작업 방법을 배우고 난 후에 언급 한 교차 절단 문제는 일반적으로 기존의 권장 라이브러리와 함께 제공되는 기존 라이브러리 사용을 고려하십시오. 다양한 유형의 응용 프로그램으로 배선하는 방법. –

+0

나는 @AlexeiLevenkov와 동의하지만, 때로는 쉬운 방법이 왜 있는지를 배우는 것뿐만 아니라 왜 그런 공통점을 어떻게 더 잘 이해할 수 있는지에 따라 학습 곡선이 어려운 것을 먼저하는 것이 좋습니다. 도서관이 작동합니다. – jleach

+0

제 경우에 당신이 의미하는 것이 무엇인지 이해하지 못합니다. 저는 이미 공용 라이브러리를 사용합니다. 예를 들어 NLog는 로깅 용입니다. 내 질문의 요점은 다른 영역에 놓여 있습니다. 공통된 코드가 있습니다 - 응용 프로그램 유형에 최소한의 적응과 최소한의 노력으로 모든 새로운 응용 프로그램을 어떻게 가져올 수 있습니까? 간단한 경우 기본 클래스를 사용할 수 있습니다. 하지만 WPF 응용 프로그램의 경우에는 그렇게 간단하지 않습니다. 표준 "WPF 응용 프로그램"템플릿은 부분적인 App 클래스와 미리 정의 된 설정 중 일부를 만듭니다. 따라서 기본 클래스와 다른 기능을 다시 만들어야합니다. 그리고 나는 그것을 어떻게 벗어날 수 있는지 묻습니다. – Alex34758

답변

2

전체 프로젝트 및 특히 프로젝트 유형에 따라 코드를 다시 사용하려면 wpf , winforms, console, web 등)을 사용하려면 별도의 클래스 라이브러리 프로젝트를 만드는 것이 좋습니다. 이러한 유형의 프로젝트에는 사용자 인터페이스/응용 프로그램이 없습니다. DLL 파일로 컴파일되어 다른 .NET 프로젝트에서 참조 할 수 있습니다.

또는 동일한 솔루션 내에서 여러 프로젝트를 가질 수 있습니다. 동일한 솔루션 내에서 서로 다른 두 개의 응용 프로그램 프로젝트가 공유 코드 기반을 위해 또 다른 클래스 라이브러리 프로젝트를 사용하도록 종속성을 가진 여러 프로젝트를 설정하는 경우가 일반적입니다.

은 아래를 참조하십시오 :

enter image description here

이 내가 사용하는 전형적인 웹 애플리케이션 프로젝트 템플릿입니다. Domain 프로젝트는 다른 모든 프로젝트가 참조하는 비즈니스 개체로 구성된 종속성 체인의 맨 아래에 있습니다. 데이터 프로젝트에는 다른 프로젝트가 액세스 할 수있는 데이터 액세스 코드가 있습니다 (도메인 제외). 웹은 웹 응용 프로그램이고 서비스는 서버 기반 유틸리티 등을위한 콘솔 응용 프로그램입니다. 둘 다 동일한 도메인 및 데이터 (및 기타 몇 가지) 프로젝트를 공유합니다. 위의 경우

, 내 웹 프로젝트에서 나는 DomainServices 프로젝트에 대한 참조를 설정 것, 그 다음 내 웹 프로젝트에서 같은 것을 할 : 우리는 지금 로거를 사용하고

using System; 
using Template.DomainServices; 
namespace Template.Web { 
    public class MyClass { 
     ILogger logger = new DomainServices.DefaultLogger(); 
     public void Log(string msg) { 
      logger.Log(msg); 
     } 
    } 
} 

구현을 DomainServices 공유 프로젝트에서 호출하여 웹 프로젝트에서 호출하면 원하는 다른 프로젝트에서도 동일하게 수행 할 수 있습니다 (부여 된 코드의 관점에서 기술적으로 가장 정확하지는 않지만 아이디어?)

아마도 이것이 어떻게 접근 할 수 있을지에 대한 아이디어를 제공합니까?

WPF 기본 클래스 (또는 모든 응용 프로그램 플랫폼 특정 클래스)에서 파생됨에 따른 하나의 복잡성은 라이브러리 클래스가 해당 특정 응용 프로그램 플랫폼에 묶여 있다는 것입니다. 경우에 따라 필요한 기능이 해당 플랫폼에만 해당되는 경우이 기능이 필요할 수 있습니다. 로거 (logger)와 같은 다른 경우 (예 : 많은 다른 것들)는 모든 응용 프로그램 플랫폼에서 사용할 수있는 평범한 오래된 C# 개체 (POCO) 일 수 있습니다. 일반적으로 특정 플랫폼을 대상으로 확장하거나 특정 플랫폼을 확장해야하는 경우를 제외하고는 플랫폼에 구속받지 않는 라이브러리를 작성하는 것이 목표입니다.

+0

더 구체적 일 것입니다. 로깅을 포함하는 UnhandledException 핸들러가 있습니다 - 어떻게 모든 유사한 응용 프로그램 (WPF, Forms, UWP)을 통해 이러한 핸들러를 사용할 수 있습니까? 기본 클래스, 종속성 삽입, 각 유형의 응용 프로그램에 대한 사용자 지정 Visual Studio 템플릿 또는 기타 – Alex34758

+0

그리고 더 구체적이지 않은 : 나는 처리되지 않은 예외를 처리하는 코드를 가지고있다. (모든 애플 리케이션 유형에 대해 한 가지 방식으로), 서비스를 삽입한다. 시작시 모든 새로운 애플리케이션에이 코드를 추가하고 싶다. WPF, Forms, UWP, WCF 애플 리케이션을위한 개별적인 접근 방식이 필요합니까? – Alex34758

+0

나는 외부 라이브러리를 서비스로 사용할 수 있다는 것을 이미 알고있다. 그러나 모든 유형의 앱에서 서비스 삽입, UnhandledException 이벤트 구독 및 기타 기본 초기화 코드를 균일하게 추가하는 방법은 무엇입니까? 어쩌면 그것은 불가능하거나 (아니면 최선의 방법이 아닌가?) 그리고 각 유형의 응용 프로그램마다 고유 한 시작 템플릿을 만드는 것이 가치가 있습니다. 각 유형의 응용 프로그램마다 고유 한 방식으로 초기화를 추가 할 수 있습니까? – Alex34758