2016-10-27 5 views
1

Ninject 프레임 워크를 사용하여 wpf 응용 프로그램에 DI를 추가합니다. 커널을 App 클래스의 정적 멤버 인 으로 저장하는 것이 적절합니까 아니면 App 클래스에서 삭제하고 인스턴스를 만들 때마다 (IUnitOfWork unit = new ...) 사용하기 전에 Windows의 코드에서 사용해야합니다. 블록? 다른 창에서 커널 호출맞습니까? 응용 프로그램의 종속 변수 커널을 정적 변수로 저장 하시겠습니까?

App.xaml.cs를

public partial class App : Application 
{ 
    internal static StandardKernel kernel; 

    protected override void OnStartup(StartupEventArgs e) 
    { 
     kernel = new StandardKernel(); 
     kernel.Load(Assembly.GetExecutingAssembly()); 
     base.OnStartup(e); 
    } 
} 

:

using (IUnitOfWork unitOfWork = App.kernel.Get<IUnitOfWork>()) 
     { 
      comboFloors.ItemsSource = unitOfWork.Buildings.GetLivingFloors(); 
     } 

답변

0

는 응용 프로그램 클래스의 정적 멤버로 저장 커널이 적절한가, 아니면 차라리 App 클래스에서 삭제하고 인스턴스를 만들 때마다 창 코드에서 사용해야합니다.

일반적으로 응용 프로그램의 수명 동안 Kernel 클래스의 인스턴스는 하나만 있어야합니다. Kernel 인스턴스는 스레드에서 안전하게 사용할 수 있으며 다시 사용할 수 있도록 최적화되어 있습니다. 각 요청 또는 창에 대해 생성하면 큰 오버 헤드가 발생할 수 있습니다 (menory 및 성능).

이 인스턴스를 저장하는 위치는 다른 이야기입니다. 일반적으로 응용 프로그램 코드에서 직접 호출하는 것을 방지하려고합니다. Composition Root 안에 만 사용하고 싶을뿐입니다. App 클래스 자체 만이 Kernel을 보유하고 서비스를 해결할 수있는 경우에는 나에게 완벽하게 문제가되는 것 같습니다.