Service 棱镜&x2B;MEF:如何将参数正确加载到我的一个服务中?

Service 棱镜&x2B;MEF:如何将参数正确加载到我的一个服务中?,service,dependency-injection,prism,mef,Service,Dependency Injection,Prism,Mef,基本上,我有以下场景: App.xaml.cs: MyBootstrapper.cs: 如何将x和y正确加载到服务中?此外,我如何确保在执行此操作时不会与容器中的任何其他内容发生冲突?您不必使用StartupEventArgs。您的FooBarService可以这样简单地使用: [Export("FooBarService", typeof(IFooBarService))] public class FooBarService : IFooBarService { public vo

基本上,我有以下场景:

App.xaml.cs:

MyBootstrapper.cs:



如何将x和y正确加载到服务中?此外,我如何确保在执行此操作时不会与容器中的任何其他内容发生冲突?

您不必使用StartupEventArgs。您的FooBarService可以这样简单地使用:

[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; }
}

编辑:我不确定args[0]是第一个参数还是程序调用,您必须尝试一下,在这种情况下,开关会进一步索引

嗯,这是个好主意,但我唯一不喜欢的是它接管了使用它的应用程序的命令行。它强制应用程序处理前两个参数是为该服务保留的这一事实,如果其他服务也这样做,可能会导致冲突。然后呢?两个服务出于不同的原因为相同的args顺序而斗争。@michael那么,只需将抽象级别提高一级即可。创建一个CommandLineArgumentService,处理argumentorder和其他内容的所有细节。
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();
    }
}
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; }
}
[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; }
}