2011-03-08 2 views
2

나는 다음과 같은 시나리오가 :프리즘 + MEF : 내 서비스에 인수를 올바르게로드하는 방법은 무엇입니까? 기본적으로

App.xaml.cs를 :

protected override void OnStartup(StartupEventArgs e) 
{ 
    base.OnStartup(e); 

    string x = (e.Args.Length > 0) ? e.Args[0]; 
    string y = (e.Args.Length > 1) ? e.Args[1]; 

    Bootstrapper bootstrapper = new MyBootstrapper(x, y); 
    bootstrapper.Run(); 
} 

MyBootstrapper.cs :

public sealed class MyBootstrapper : MefBootstrapper 
{ 
    private string _x; 
    private string _y; 

    public MyBootstrapper(string x, string y) 
    { 
     _x = x; 
     _y = y; 
    } 

    protected override void ConfigureAggregateCatalog() 
    { 
     base.ConfigureAggregateCatalog(); 

     AggregateCatalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly())); 
    } 

    protected override DependencyObject CreateShell() 
    { 
     return Container.GetExportedValue<ClientShell>(); 
    } 

    protected override void InitializeShell() 
    { 
     base.InitializeShell(); 

     Application.Current.MainWindow = (Window)Shell; 
     Application.Current.MainWindow.Show(); 
    } 
} 

FooBarService.cs을

public interface IFooBarService 
{ 
    string x { get; } 
    string y { get; } 
} 

[Export("FooBarService", typeof(IFooBarService))] 
public class FooBarService : IFooBarService 
{ 
    string x { get; protected set; } 
    string y { get; protected set; } 
} 

내 서비스에 x 및 y를 제대로로드하려면 어떻게해야합니까? 또한이 작업을 수행 할 때 컨테이너 또는 다른 컨테이너와 충돌하지 않도록하려면 어떻게해야합니까?

답변

1

StartupEventArgs를 사용할 필요가 없습니다.

[Export("FooBarService", typeof(IFooBarService))] 
public class FooBarService : IFooBarService 
{ 
    public void FooBarService() 
    { 
     var args = Environment.GetCommandLineArgs(); 
     x = (args.Length > 0) ? args[0]:""; 
     y = (args.Length > 1) ? args[1]:""; 
    } 
    string x { get; protected set; } 
    string y { get; protected set; } 
} 

편집 : 단순히 같은 Environment.GetCommandLineArgs를 사용할 수 있습니다 귀하의 FooBarService 내가 인수 [0] 첫 번째 매개 변수 또는 프로그램 호출이 있는지 확실하지 않습니다, 당신은 밖으로 시도하고이 경우 스위치를해야 인덱스 하나 더!

+0

흠, 좋은 생각인데, 내가 좋아하지 않는 유일한 점은 그것을 소비하는 앱의 명령 줄을 대신한다는 것입니다. 첫 번째 2 개의 인수가이 서비스 용으로 예약되어있어 다른 서비스가 동일하게 수행하면 충돌을 일으킬 수 있다는 사실을 앱이 강제로 처리합니다. 그리고 뭐? 두 가지 서비스가 다른 이유로 args의 동일한 순서로 싸우고 있습니다. – michael

+1

@michael 그럼 추상화를 한 단계 더 높이십시오. argumentsorder 및 내용에 대한 모든 세부 정보를 처리하는 CommandLineArgumentService를 만듭니다. –

관련 문제