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