C# 导入不同项目中的构造函数装饰器

C# 导入不同项目中的构造函数装饰器,c#,mef,C#,Mef,我第一次使用这些装饰器(Export(typeOf)和ImportConstructor) 在mvvm体系结构中,我有一个具有以下构造函数的AppViewModel: [ImportingConstructor] public AppViewModel(IEventAggregator events, PatientsManagerViewModel pmvm, TestManagerViewModel tmvm, MainVi

我第一次使用这些装饰器(Export(typeOf)和ImportConstructor)

在mvvm体系结构中,我有一个具有以下构造函数的AppViewModel:

[ImportingConstructor]
        public AppViewModel(IEventAggregator events, 
            PatientsManagerViewModel pmvm, TestManagerViewModel tmvm, 
            MainViewModel mvm)
        {

            patientsManagerVM = pmvm;
            testManagerVM = tmvm;
            mainVM = mvm;            
        }
使用以下增压器:

public class AppBootstrapper : Bootstrapper<IShell>
    {
        private CompositionContainer container;

        public AppBootstrapper()
        {
            Start();
        }

        protected override void Configure()
        {
            container = new CompositionContainer(
                new AggregateCatalog(
                    AssemblySource.Instance.Select(x => new AssemblyCatalog(x)).OfType<ComposablePartCatalog>()
                    )
                );

            var batch = new CompositionBatch();

            batch.AddExportedValue<IWindowManager>(new WindowManager());
            batch.AddExportedValue<IEventAggregator>(new EventAggregator());
            batch.AddExportedValue(container);

            container.Compose(batch);
        }

        protected override object GetInstance(Type serviceType, string key)
        {
            string contract = string.IsNullOrEmpty(key) ? AttributedModelServices.GetContractName(serviceType) : key;
            var exports = container.GetExportedValues<object>(contract);

            if (exports.Any())
                return exports.First();

            throw new Exception(string.Format("Could not locate any instances of contract {0}.", contract));
        }

        protected override IEnumerable<object> GetAllInstances(Type serviceType)
        {
            return container.GetExportedValues<object>(AttributedModelServices.GetContractName(serviceType));
        }

        protected override void BuildUp(object instance)
        {
            container.SatisfyImportsOnce(instance);
        }

        protected override void OnStartup(object sender, StartupEventArgs e)
        {
            DisplayRootViewFor<IShell>();
        }
    }
我想我可以从PatientsManagerViewModel对象调用它

但我认为,由于AppViewModel的构造函数需要PatientManager视图模型,而这个需要UOW,所以我无法在AppViewModel构造函数中创建UOW

所以我想我可以做这个修改:

[Export(typeof(IOtherProjectUOW))]
    public class OtherProjectUOW : IOtherProjectUOW, IDisposable
    {
        [....]

        public OtherProjectUOW()
        {
            CreateDbcontext();

            RepositoryProvider repositoryProvider = new Helper.RepositoryProvider(new RepositoryFactories());
            repositoryProvider.DbContext = DbContext;
            RepositoryProvider = repositoryProvider;
        }
(注:该UOW在另一个项目中)

AppViewModel的修改如下:

[Export (typeof(IShell))]
    public class AppViewModel : Conductor<object>, IShell, IHandle<ChangeViewEvent>
    {
        PatientsManagerViewModel patientsManagerVM;
        TestManagerViewModel testManagerVM;
        MainViewModel mainVM;        

        public static IOtherProjectUOW UOW { get; private set; }

        [ImportingConstructor]
        public AppViewModel(IEventAggregator events, 
            PatientsManagerViewModel pmvm, TestManagerViewModel tmvm, 
            MainViewModel mvm, IKantaUOW kuow)
        {
            patientsManagerVM = pmvm;
            testManagerVM = tmvm;
            mainVM = mvm;

            UOW = kuow;          
        }
[导出(类型化(IShell))]
公共类AppViewModel:导体、IShell、IHandle
{
PatientsManagerViewModel patientsManagerVM;
TestManagerViewModel testManagerVM;
MainViewModelMainVM;
公共静态IOtherProjectUOW{get;私有集;}
[导入构造函数]
公共AppViewModel(IEventAggregator事件,
PatientsManagerViewModel pmvm、TestManagerViewModel tmvm、,
主视图模型mvm,IKantaUOW-kuow)
{
patientsManagerVM=pmvm;
testManagerVM=tmvm;
mainVM=mvm;
UOW=kuow;
}
但是如果我尝试这样做,我会在Bootstrapper类中收到一个错误,它说:

--“找不到contract MainApplication.IShell的任何实例。”--

所以我很肯定进出口系统不起作用

感谢您的帮助

[Export (typeof(IShell))]
    public class AppViewModel : Conductor<object>, IShell, IHandle<ChangeViewEvent>
    {
        PatientsManagerViewModel patientsManagerVM;
        TestManagerViewModel testManagerVM;
        MainViewModel mainVM;        

        public static IOtherProjectUOW UOW { get; private set; }

        [ImportingConstructor]
        public AppViewModel(IEventAggregator events, 
            PatientsManagerViewModel pmvm, TestManagerViewModel tmvm, 
            MainViewModel mvm, IKantaUOW kuow)
        {
            patientsManagerVM = pmvm;
            testManagerVM = tmvm;
            mainVM = mvm;

            UOW = kuow;          
        }