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

时间:2014-03-25 16:08:06

标签: c# mef

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

在mvvm架构中,我有一个带有以下构造函数的AppViewModel:

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

            patientsManagerVM = pmvm;
            testManagerVM = tmvm;
            mainVM = mvm;            
        }

并使用以下Boostrapper:

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>();
        }
    }

应用程序启动没有问题。

当我尝试访问另一个项目时出现问题,该项目负责UnitOfWork,Repository以及与DB相关的所有操作。 该项目在我的主要应用程序所在的地方引用。

我在PatientsManagerViewModel中需要这个对象(UOW) 我第一次在AppViewModel的构造函数中创建了一个名为AppUOW的静态属性:

UOW = new OtherProject.UOW(new RepositoryProvider(new RepositoryFactory));

以为我可以从我的PatientsManagerViewModel对象中调用它。

但我认为,因为AppViewModel的构造函数需要一个PatientManagerViewModel而且这个需要一个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;
        }

(N.B:这个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;          
        }

但是,如果我尝试这个,我在Bootstrapper类中收到错误说:

- “无法找到合同MainApplication.IShell的任何实例。” -

所以我很确定导出 - 导入系统无效。

感谢任何帮助。

0 个答案:

没有答案