C# 具有映射到函数的字符串的字典

C# 具有映射到函数的字符串的字典,c#,C#,我对C#比较陌生。我在做一些控制台应用程序项目,它们依赖于用户输入,并根据用户输入启动不同的功能 我认为将可能的输入映射到字典中的函数可能更简单、更灵活 有人告诉我,这可能是一个糟糕的设计选择,但没有给出一个明确的解释 class Request<T> : IRequest<T> { string Route { get; set; } T Body { get; set; } } class Response<T> : IResponse&

我对C#比较陌生。我在做一些控制台应用程序项目,它们依赖于用户输入,并根据用户输入启动不同的功能

我认为将可能的输入映射到字典中的函数可能更简单、更灵活


有人告诉我,这可能是一个糟糕的设计选择,但没有给出一个明确的解释

class Request<T> : IRequest<T>
{
    string Route { get; set; }
    T Body { get; set; }
}

class Response<T> : IResponse<T>
{
    string Route { get; set; }
    T Body { get; set; }
}


class Router : IRoutable
{
    Dictionary<string, Func<IRequest<T>, IResponse<T>> Routes { get; set; }
}
类请求:IRequest
{
字符串路由{get;set;}
T体{get;set;}
}
班级回应:我回应
{
字符串路由{get;set;}
T Body{get;set;}
}
类路由器:IRoutable
{
字典

有人告诉我,这可能是一个糟糕的设计选择,但没有给出一个明确的解释

你应该要求那个人澄清

这会使我的设计更糟糕/更脆弱吗?如果会,为什么

(我假设您的接口(未显示)与实现它们的类具有相同的表面积。如果不是这样,则您在问题中忽略了关键细节,应该更新问题。)

是的,绝对是。你的设计允许任何人以任何理由随时更改系统的任何方面!这是一场安全噩梦

此外,它还公开了接口中应该包含的实现细节。假设有人想使用并发字典?或不可变查找?不,他们不能;他们必须在接口中使用字典

让我们退一步,基本的部分是什么

  • 路由由字符串表示
  • 请求有一个主体和一个路由
  • 响应有一个主体和一条路径
  • 服务器接收请求并返回响应
  • 路由器采用路由并返回服务器
让我们来写这些

interface IRoute
{
  string Route { get; }
}
interface IRequest<T>
{
  IRoute Route { get; }
  T Request { get; }
}
interface IResponse<T>
{
  IRoute Route { get; }
  T Response { get; }
}
interface IServer
{
  IResponse<T> Process<T>(IRequest<T> request);
}
interface IRouter
{
  IServer GetServer(IRoute route);
}
接口路由
{
字符串路由{get;}
}
接口IRequest
{
IRoute路由{get;}
T请求{get;}
}
接口响应
{
IRoute路由{get;}
T响应{get;}
}
接口IServer
{
i响应过程(IRequest请求);
}
接口外部
{
IServer GetServer(IRoute路由);
}
请记住,接口代表了您需要向其客户机公开的最低契约。您有什么理由需要知道IRouter是用字典实现的吗?没有。那么不要公开它。路由器会采取一条路由,并为您提供一台服务器,到此为止。让实现者来决定它们是否可用想不想用字典

任何可能的字符串都是路由吗?任何路由都可以用作字符串吗?如果不是,则不要在接口中将路由表示为字符串。是否有人可能将不表示路由的字符串表达式误认为表示路由的字符串表达式?使类型系统捕获该错误!生成表示路由的类型。

类似地,不要让任何人编写他们没有业务编写的任何内容。接口中的每个属性都应该是只读的,除非它是任何人都可以更改的类型的按设计特性

另一个问题是:为什么接口?每个都有三个或多个实现吗?如果不是,考虑把它们变成密封类或结构,最好是不可变类型。


有人告诉我,这可能是一个糟糕的设计选择,但没有给出一个明确的解释

你应该要求那个人澄清

这会使我的设计更糟糕/更脆弱吗?如果会,为什么

(我假设您的接口(未显示)与实现它们的类具有相同的表面积。如果不是这样,则您在问题中忽略了关键细节,应该更新问题。)

是的,绝对是。你的设计允许任何人以任何理由随时更改系统的任何方面!这是一场安全噩梦

此外,它还公开了接口中应该包含的实现细节。假设有人想使用并发字典?或不可变查找?不,他们不能;他们必须在接口中使用字典

让我们退一步,基本的部分是什么

  • 路由由字符串表示
  • 请求有一个主体和一个路由
  • 响应有一个主体和一条路径
  • 服务器接收请求并返回响应
  • 路由器采用路由并返回服务器
让我们来写这些

interface IRoute
{
  string Route { get; }
}
interface IRequest<T>
{
  IRoute Route { get; }
  T Request { get; }
}
interface IResponse<T>
{
  IRoute Route { get; }
  T Response { get; }
}
interface IServer
{
  IResponse<T> Process<T>(IRequest<T> request);
}
interface IRouter
{
  IServer GetServer(IRoute route);
}
接口路由
{
字符串路由{get;}
}
接口IRequest
{
IRoute路由{get;}
T请求{get;}
}
接口响应
{
IRoute路由{get;}
T响应{get;}
}
接口IServer
{
i响应过程(IRequest请求);
}
接口外部
{
IServer GetServer(IRoute路由);
}
请记住,接口代表了您需要向其客户机公开的最低契约。您有什么理由需要知道IRouter是用字典实现的吗?没有。那么不要公开它。路由器会采取一条路由,并为您提供一台服务器,到此为止。让实现者来决定它们是否可用想不想用字典

任何可能的字符串都是路由吗?任何路由都可以用作字符串吗?如果不是,则不要在接口中将路由表示为字符串。是否有人可能将不表示路由的字符串表达式误认为表示路由的字符串表达式?使类型系统捕获该错误!生成表示路由的类型。

类似地,不要让任何人编写他们没有业务编写的任何内容。接口中的每个属性都应该是只读的,除非它是任何人都可以更改的类型的按设计特性


另一个问题是:为什么接口?每个都有三个或多个实现吗?如果不是,考虑把它们变成密封类或结构,最好是不可变类型。

“我被告知这可能是一个坏的设计选择”,WHO基于什么?