我有很多特定通用接口的实现,并希望在构造函数中解析所有这些实现。当然,我可以在构造函数中添加每个实现。这将导致构造函数具有超过30个参数,这些参数在查看和开发时并不是很好。
在对此问题进行一些研究时,我发现可以在构造函数中注入IEnumerable
接口,有点像IEnumerable<IScriptExecution> scriptExecutionImplementations
这就是我正在寻找的东西,但我需要它是这样的:
public TheConstructor(IEnumerable<IScriptExecution<T>> scriptExecutionImplementations)
{}
是否可以使用Autofac?
在构造函数中注入所有IScriptExecution<T>
以下是我的注册类摘录:
builder.RegisterType<Library.ShardManager.Execution.DataScript.Users>().As<IScriptExecution<DBUser>>();
builder.RegisterType<Library.ShardManager.Execution.DataScript.Companies>().As<IScriptExecution<DBCompany>>();
注意:我认为我不需要使用Open Generics,因为我已经知道了类型,因此您无法在构造函数中使用开放式泛型。
根据Jim Bolla在评论部分的要求,我想要如何使用它。 目前我已经有了这个构造函数:
public MoveShardletData(Guid shardletId, ShardLocation oldLocation, ShardLocation newLocation, ILog log,
IScriptCreator<DBAnalyticsInvitation> scriptAnalyticsInvitation, IScriptCreator<DBAnalyticsPromotion> scriptAnalyticsPromotion,
IScriptCreator<DBAnalyticsRetailerSubscriptionModule> scriptAnalyticsRetailerSubscriptionModule, IScriptCreator<DBAnalyticsRetailerSubscription> scriptAnalyticsRetailerSubscription, //and the list goes on...
我要使用IScriptCreator<T>
对象的代码片段看起来有点像这样:
var analyticsInvitations = GetTheAnalyticsInvitationObjects(someLocalVariableInTheCurrentScope)
var script = scriptAnalyticsInvitation.Insert(analyticsInvitations);
sb.Append(script);
//With all IScriptCreator<T> objects listed here in the same fashion.
如果可以在循环中完成这将是很好的。由于someLocalVariableInTheCurrentScope
有点难以提取这段代码。
集合analyticsInvitations
是T
类型。如果我可以访问Autofac容器,我可以手动解决正确的IScriptCreator<T>
,但这样做不会被告知。