【发布时间】:2012-06-18 19:12:37
【问题描述】:
鉴于某些模块本身具有依赖关系,我正在努力解决如何在模块中组织我的 Autofac 组件注册。
我在接口中实现了配置数据的抽象(即 web.config):
interface IConfigurationProvider
{
T GetSection<T>(string sectionName)
where T : System.Configuration.ConfigurationSection;
}
以及 ASP.NET (WebConfigurationProvider) 和“桌面”应用程序 (ExeConfigurationProvider) 的实现。
我的一些 autofac 模块需要 IConfigurationProvider 作为构造函数参数,但有些不需要:
class DependentModule : Module
{
public DependentModule(IConfigurationProvider config)
{
_config = config;
}
protected override void Load(ContainerBuilder builder)
{
var configSection = _config.GetSection<CustomConfigSection>("customSection");
builder.RegisterType(configSection.TypeFromConfig);
}
private readonly IConfigurationProvider _config;
}
class IndependentModule : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.Register(/* other stuff not based on configuration */);
}
}
由于RegisterType() 扩展方法不接受注册委托(Func<IComponentContext, T>),就像Register() 一样,我无法预先注册IConfigurationProvider,然后在我去注册时解决它配置中指定的类型,例如:
// this would be nice...
builder.RegisterType(c => c.Resolve<IConfigurationProvider>().GetSection<CustomConfigSection>("sectionName").TypeFromConfig);
这意味着我需要能够注册模块有和没有对IConfigurationProvider的依赖。
很明显如何手动实例化每个模块并注册它:
IConfigurationProvider configProvider = ...;
var builder = new ContainerBuilder();
builder.RegisterModule(new DependentModule(configProvider));
builder.RegisterModule(new IndependentModule());
using (var container = builder.Build())
{
...
}
但我不想手动实例化我的模块 - 我想扫描程序集以查找模块并自动注册它们(如 in this question 所讨论的)。所以我必须使用反射来扫描程序集的IModule 类型,并使用Activator.CreateInstance 来制作可注册的实例。但是我怎么知道是否将IConfigurationProvider 作为构造函数参数传递。当其他模块有额外的或不同的依赖时会发生什么?
必须有一种更直接的方法来完成基本任务:注册在通过接口提供的某些配置中指定的类型,对吗?那我该怎么做呢?
【问题讨论】:
-
你最后解决了吗?我有非常相似的情况,但是我的依赖又具有另一个依赖(我想从 db 获取配置,所以我有一个依赖于 IRepoConfig 的 IConfigProvider)
-
@Learner,我最初使用 Autofac 和 MEF 的组合实现了一些东西,它模仿了 Jim Bolla 在下面的回答,但它非常复杂,我很快就把它删除了。我不再有依赖模块:由于我的主要用例是基于
Type的选择,因此我采取了注册 所有候选人的方法,然后根据来自ConfigurationSection的属性解析。如果您愿意,我可以向您发送示例代码。 -
好的,谢谢。我认为我不能在我的情况下使用 ConfigurationSection / xml。
-
这可能会有所帮助:stackoverflow.com/a/57257634/1453867