我第一次使用这些装饰器(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的任何实例。” -
所以我很确定导出 - 导入系统无效。
感谢任何帮助。