c# - 减少不断增加的构造函数服务参数
问题描述
我对使用 Autofac 还是很陌生,并且对我正在使用的构造函数注入方法感到困扰。这是场景:
我目前有两个继承IForms
接口的类。每个类也有自己的接口
public interface IForms
{
long CreateNewForm(FormData data);
FormData RetrieveFormById(long id);
}
public interface IFormA : IForms
{ }
public interface IFormB : IForms
{ }
现在我有一个处理这个的类,如下所示:
public class ApplicationForms : IApplicationForms
{
private readonly IFormA _formA;
private readonly IFormB _formB;
public ApplicationForms(IFormA formA, IFormB formB)
{
_formA = formA;
_formB = formB;
}
public void SubmitApplicationForm(FormData data)
{
switch(data.FormType)
{
case FormType.FormA:
_formA.CreateNewForm(data);
break;
case FormType.FormB:
_formB.CreateNewForm(data);
break;
}
}
}
现在有可能还会有 2 种形式出现(例如FormC
, FormD
, FormE
)。这里会发生的是构造函数中多了 3 个构造函数参数ApplicationForms
。
有没有一种方法可以将所有构造函数参数组合成一个参数?我可以看到它最终肯定会看起来很丑。
解决方案
既然有通用IForms
接口,那么就可以注入一个枚举。
这看起来像是策略模式的一个很好的候选者。
我建议重构基本接口,以便能够识别它是什么类型的表单
public interface IForms {
FormType FormType { get; }
long CreateNewForm(FormData data);
FormData RetrieveFormById(long id);
}
并更新依赖类
public class ApplicationForms : IApplicationForms {
private readonly IEnumerable<IForms> forms;
public ApplicationForms(IEnumerable<IForms> forms) {
this.forms = forms;
}
public void SubmitApplicationForm(FormData data) {
var form = forms.FirstOrDefault(_ => _.FormType == data.FormType);
if(form != null)
form.CreateNewForm(data);
//...
}
}
这假定在注册派生接口时将其与基IForms
接口相关联。
var builder = new ContainerBuilder();
builder.RegisterType<FormA>().As<IForms>();
builder.RegisterType<FormB>().As<IForms>();
builder.RegisterType<FormC>().As<IForms>();
//...
现在,无论添加多少表单,该类都可以在不修改的情况下执行。
推荐阅读
- python - Django 3.0.5 用户使用用户名或电子邮件进行身份验证
- wordpress - 点击时WordPress嵌入链接没有反应
- android - 使用 MediaRecorder 录制的视频仅在三星设备中播放第一帧
- jquery - 当响应为 json 时,Laravel 响应 id 会发生变化,但是在转储数据时,id 就在那里
- python - 设置 matplotlib 子图的大小
- r - kNN算法只预测一组
- linux - 从 Pam 模块检索客户端端口号
- excel - 如何使用守夜人打印excel中存在的单元格的数据类型?
- matplotlib - 如何为添加 Cartopy 形状特征的 GeoAxes 添加图例?
- javascript - 是什么让我的变量在从 DOM 中选择时具有 null 值