gpt4 book ai didi

c# - 将 MEF 与企业库一起使用

转载 作者:太空宇宙 更新时间:2023-11-03 13:47:07 25 4
gpt4 key购买 nike

我正在尝试覆盖企业库的默认 Unity 容器行为,以便我可以使用我的 MEF 容器。有一些资源解释了如何执行此操作,但我只是不明白:

SO 上也有这篇文章,但代码无法编译,因为 LogWriter protected 。我认为这是指旧版本:

据我所知,我需要为我的 MEF 容器使用 CommonServiceLocator,然后将其附加到企业库容器。这是我的容器配置器:

public class MefContainerConfigurator : IContainerConfigurator, IServiceLocator
{
[Import] private CatalogExportProvider provider;

public object GetService(Type serviceType)
{
throw new NotImplementedException();
}

public object GetInstance(Type serviceType)
{
return provider.GetExportedValue<Type>();
}

public object GetInstance(Type serviceType, string key)
{
throw new NotImplementedException();
}

public IEnumerable<object> GetAllInstances(Type serviceType)
{
throw new NotImplementedException();
}

public TService GetInstance<TService>()
{
return provider.GetExportedValue<TService>();
}

public TService GetInstance<TService>(string key)
{
return provider.GetExportedValue<TService>(key);
}

public IEnumerable<TService> GetAllInstances<TService>()
{
return provider.GetExportedValues<TService>();
}

public void RegisterAll(IConfigurationSource configurationSource, ITypeRegistrationsProvider rootProvider)
{
throw new NotImplementedException();
}
}

在我的 Bootstrap 中:

var configurator = new MefContainerConfigurator();
// Does this line read the Enterprise Library configuration from the app.config?
IConfigurationSource cs = new SystemConfigurationSource();

EnterpriseLibraryContainer.ConfigureContainer(configurator, cs);

我想也许我需要使用 LogWriterImplExceptionManagerImpl 类,因为它们具有接受配置的构造函数。我现在的问题是:

  • 如何从 IConfigurationSource 检索配置并将其提供给 LogWriterImplExceptionManagerImpl 构造函数的构造函数?
  • EnterpriseLibraryContainer.ConfigureContainer 在我的 MefContainerConfigurator 中调用 RegisterAll。这是我应该将所有企业库类型注册到容器中的地方吗?
  • IServiceLocator 接口(interface)中我保留为 NotImplemented 的方法;我找不到一种方法来使用这些从我的容器中返回对象。我是否应该将它们保留为未实现并改用通用方法?

编辑

我仍然不能完全正确。基于@Chris Tavares 的回答,我在 MefContainerConfigurator 中编写了我的 RegisterAll 方法来遍历 TypeRegistrations 并将它们添加到容器中。我一辈子都想不出如何将它们合并到我的 Bootstrapper 类中创建的 AggregateContainer 中,这样我就可以在 之外实际使用这些导出>容器配置器:

public void RegisterAll(IConfigurationSource configurationSource, ITypeRegistrationsProvider rootProvider)
{
var registrations = rootProvider.GetRegistrations(configurationSource);

foreach (var type in registrations)
{
var builder = new RegistrationBuilder();

builder.ForType(type.ServiceType).Export();

var cat = new AssemblyCatalog(type.ServiceType.Assembly, builder);
var container = new CompositionContainer(cat);
container.ComposeParts(this);
}
}

在 Prism Bootstrap 中配置聚合目录:

protected override void ConfigureAggregateCatalog()
{
AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(RegionNames).Assembly));
// Module assemblies
AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(DataEntryModule).Assembly));
AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(ReportingModule).Assembly));
AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(StatusBarModule).Assembly));
AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(SplashScreenModule).Assembly));
AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(WelcomeModule).Assembly));
AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(AdministrationModule).Assembly));

AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(Bootstrapper).Assembly));
}

最佳答案

您的容器配置器非常不完整。您有一个要实现的方法:RegisterAll,但您没有实现它。

你不必从config中读取原始配置信息;取而代之的是,当您调用 EnterpriseLibraryContianer.ConfigureContainer 时,Entlib 将遍历配置源,挑选出所有重要的位,并为您提供一系列 TypeRegistration 对象。这些人会为您提供类型映射和构造函数依赖项等。基本上是您在容器(在本例中为 MEF)中注册依赖项所需的所有内容。

所以基本上您需要做的是编写代码,将抽象的 TypeRegistration 对象转换为 MEF 的正确配置。

Unity 在这方面并不特殊;它也有一个配置器,并遵循完全相同的过程,因此您可以查看 entlib 代码作为您需要执行的各种操作的示例。

我完全不了解 MEF api,因此很遗憾无法帮助您进行具体实现。

关于c# - 将 MEF 与企业库一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14928636/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com