我需要帮助转换以下类,以便在我正在开发的程序中使用。最初是IdeaBlade
的一个演示程序,称为"PRISM EXPLORER"
,基于Unity
。我需要帮助将一部分从UNITY转换为MEF。其他的都是我处理的。就盯着这个。我已经用MEF标记了我的类"[EXPORT(typeof(XXX))]",我认为我需要以某种方式使用"ComposeExportedValue"。令人困惑的部分是找到这一行的等号:
var provider =
(IEntityManagerProvider) _container.Resolve<IPersistenceGateway>();
_container.RegisterInstance<IEntityManagerProvider>(provider);
谢谢!
下面是我需要转换的整个类。你可以在这里找到原文:Ideablade PRISM页面
using Microsoft.Practices.Composite.Modularity;
using Microsoft.Practices.Composite.Regions;
using Microsoft.Practices.Unity;
using PrismExplorer.Infrastructure;
namespace ModelExplorer.Explorer {
public class ExplorerModule : IModule {
private readonly IUnityContainer _container;
public ExplorerModule(IUnityContainer container) {
_container = container;
}
public void Initialize() {
InitializeContainer();
SetViews();
}
// ToDo: Consider getting from configuration
private void InitializeContainer() {
RegisterGatewayAndEntityManagerProvider();
_container.RegisterType<IQueryRepository, QueryRepository>(
new ContainerControlledLifetimeManager()); // singleton
}
private void RegisterGatewayAndEntityManagerProvider() {
_container.RegisterType<IPersistenceGateway, PrismExplorerPersistenceGateway>(
new ContainerControlledLifetimeManager()); // singleton
var provider =
(IEntityManagerProvider) _container.Resolve<IPersistenceGateway>();
_container.RegisterInstance<IEntityManagerProvider>(provider);
}
private void SetViews() {
var regionManager = _container.Resolve<IRegionManager>();
var view = _container.Resolve<ExplorerView>();
regionManager.AddToRegion(RegionNames.MainRegion, view);
regionManager.RegisterViewWithRegion(RegionNames.MainRegion, typeof(ExplorerView));
}
// Destructor strictly to demonstrate when module is GC'd
//~MevModule() {
// System.Console.WriteLine("Goodbye, MevModule");
//}
}
}
CompositionContainer
上对应的两个方法是ComposeExportedValue<T>(...)
,它允许您向容器中添加特定的实例,而GetExportedValue<T>(...)
则从容器中获取T
的实例。
如果你能设计你的类型来减少对服务位置的使用,并尝试使用构造函数注入,这将使你的代码更容易维护和测试。例如,您的代码是否可以转换为:
[Export(typeof(IModule))]
public class ExplorerModule : IModule
{
[ImportingConstructor]
public ExplorerModule(IPersistenceGateway gateway)
{
}
}