gpt4 book ai didi

c# - 如何在运行时解析类型以避免多个 if else

转载 作者:太空狗 更新时间:2023-10-29 20:47:16 25 4
gpt4 key购买 nike

我的代码可以根据请求类型进行网络服务调用。

为此,我有以下代码;

public class Client
{
IRequest request;


public Client(string requestType)
{
request = new EnrolmentRequest();
if (requestType == "Enrol")
{
request.DoEnrolment();
}
else if (requestType == "ReEnrol")
{
request.DoReEnrolment();
}
else if (requestType == "DeleteEnrolment")
{
request.DeleteEnrolment();
}
else if (requestType == "UpdateEnrolment")
{
request.UpdateEnrolment();
}
}

}

所以根据开闭原则,我可以像这样子类化:

Class EnrolmentRequest:IRequest
{
CallService();
}
Class ReEnrolmentRequest:IRequest
{
CallService();
}
Class UpdateEnrolmentRequest:IRequest
{
CallService();
}

现在我的客户类看起来像这样:

public class Client
{
public Client(string requestType)
{
IRequest request;

if (requestType == "Enrol")
{
request = new EnrolmentRequest();
request.CallService();
}
else if (requestType == "ReEnrol")
{
request = new REnrolmentRequest();
request.CallService();
}
else if (requestType == "DeleteEnrolment")
{
request = new UpdateEnrolmentRequest();
request.CallService();
}
else if (requestType == "UpdateEnrolment")
{
request = new UpdateEnrolmentRequest();
request.CallService();
}
}

}

现在,我仍然必须使用 if 和 else,如果有任何新的请求类型,我将不得不更改我的代码。

所以,它绝对不是禁止修改的。

关于 SOLID,我是否遗漏了什么?

我可以使用依赖注入(inject)来在运行时解析类型吗?

最佳答案

编写新代码来处理新需求的需求不会消失。目标是在处理新需求时不必更改旧代码,而您的类结构会处理它。

您可以通过将条件链替换为其他一些创建新实例的机制来最大限度地减少更改。例如,您可以构建字典,或使用依赖注入(inject)框架将类型与字符串相关联。

下面是一个不使用 DI 框架的实现:

private static readonly IDictionary<string,Func<IRequest>> ReqTypeMapper =
new Dictionary<string,Func<IRequest>> {
{"Enrol", () => new EnrolmentRequest() }
, {"ReEnrol", () => new ReEnrolmentRequest() }
, ...
};

现在调用看起来像这样:

Func<IRequest> maker;
if (!ReqTypeMapper.TryGetValue(requestType, out maker)) {
// Cannot find handler for type - exit
return;
}
maker().CallService();

关于c# - 如何在运行时解析类型以避免多个 if else,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42247542/

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