C# 正在寻找使此代码成为通用代码的方法

C# 正在寻找使此代码成为通用代码的方法,c#,.net,linq,asp.net-core,generics,C#,.net,Linq,Asp.net Core,Generics,我有一段代码,我将大量输入传递给方法,并将实体添加到数据库中,如下面所示 public class SpaceTypeServices { public Guid CreateRequest( SpaceTypeInput spaceTypeInput, MasterSection masterSection, RequestInput requestInputs, APIDbContext dbContext) {

我有一段代码,我将大量输入传递给方法,并将实体添加到数据库中,如下面所示

public class SpaceTypeServices
{
    public Guid CreateRequest(
       SpaceTypeInput spaceTypeInput,
       MasterSection masterSection,
       RequestInput requestInputs,
       APIDbContext dbContext)
    {      
        var id = Guid.NewGuid();
        var mechanicalData = new MechanicalData();
        var mechanicalTypeData = new MechanicalTypeData();

        var environmentCondition = new EnvironmentConditions
        {
            ConditionType = spaceTypeInput.EnvironmentConditionsInput.ConditionType,
            CoolingSetPointOccupied = spaceTypeInput.EnvironmentConditionsInput.CoolingSetPointOccupied ?? 0,
            CoolingSetPointUnOccupied = spaceTypeInput.EnvironmentConditionsInput.CoolingSetPointUnOccupied ?? 0,
            HeatingSetPointOccupied = spaceTypeInput.EnvironmentConditionsInput.HeatingSetPointOccupied ?? 0,
            RelativeHumidityMax = spaceTypeInput.EnvironmentConditionsInput.RelativeHumidityMax ?? 0,
            RelativeHumidityMin = spaceTypeInput.EnvironmentConditionsInput.RelativeHumidityMin ?? 0
        };
        var exhaustType = new Exhaust
        {
            AirflowPerArea = spaceTypeInput.ExhaustInput.AirflowPerArea ?? 0,
            AirflowPerFixture = spaceTypeInput.ExhaustInput.AirflowPerFixture ?? 0,
            MaxExhaustAirChange = spaceTypeInput.ExhaustInput.MaxExhaustAirChange ?? 0,
            MinExhaustAirChange = spaceTypeInput.ExhaustInput.MinExhaustAirChange ?? 0,
            ExhaustSource = spaceTypeInput.ExhaustInput.ExhaustSource
        };
        var thermalComfort = new ThermalComfort
        {
            AirSpeed = spaceTypeInput.ThermalComfortInput.AirSpeed ?? 0,
            ClothingInsulation = spaceTypeInput.ThermalComfortInput.ClothingInsulation ?? 0,
            MetabolicRate = spaceTypeInput.ThermalComfortInput.MetabolicRate ?? 0
        };

        // bunch of code same like as above object initialization

        mechanicalData.Exhaust = exhaustType;
        mechanicalData.Environment = environmentCondition;
        mechanicalData.ThermalComfort = thermalComfort;
        // bunch of assigning objects 

        mechanicalTypeData.MechanicalData = mechanicalData;

        var spaceType = new SpaceType
        {
            MechanicalTypeData = mechanicalTypeData,
            Description =  spaceTypeInput.Description,
        };

        dbContext.SpaceTypes.Add(spaceType);
        dbContext.SaveChanges();
        return id;
    }
我正在寻找一种方法,将这个过程转换为更通用的重构方式,但无法找到同样的方法

对于如何以更面向对象的方法或通用的方式重构这些东西,谁能有任何想法或建议,我将不胜感激

非常感谢

更新:

我正在寻找一种像这样的通用方法

  public T myFunction<T>(int id, string name) where T : class1, new()
   {
      T obj = new T();
      obj.id = id;
      obj.name = name;
      return obj;
   }
publicmyfunction(int-id,字符串名),其中T:class1,new()
{
T obj=新的T();
obj.id=id;
obj.name=名称;
返回obj;
}
有人对如何重构有什么想法或建议吗 这些东西以更加面向对象的方法或通用的方式进行,这将非常有用 谢谢我

使用除无参数构造函数之外的任何东西构造对象都会使调用方承担一定程度的责任,以了解该对象的详细信息。对象构造越复杂,调用者的负担就越重。例如:

var environmentCondition = new EnvironmentConditions
{
    ConditionType = spaceTypeInput.EnvironmentConditionsInput.ConditionType,
    CoolingSetPointOccupied = spaceTypeInput.EnvironmentConditionsInput.CoolingSetPointOccupied ?? 0,
    CoolingSetPointUnOccupied = spaceTypeInput.EnvironmentConditionsInput.CoolingSetPointUnOccupied ?? 0,
    HeatingSetPointOccupied = spaceTypeInput.EnvironmentConditionsInput.HeatingSetPointOccupied ?? 0,
    RelativeHumidityMax = spaceTypeInput.EnvironmentConditionsInput.RelativeHumidityMax ?? 0,
    RelativeHumidityMin = spaceTypeInput.EnvironmentConditionsInput.RelativeHumidityMin ?? 0
};
这个例子表明,我们不仅要知道
EnvironmentConditions
依赖于
EnvironmentConditionsInput
(不是那么糟糕),而且还必须知道这两者的属性,更糟糕的是,我们必须执行错误检查/默认值。因为这是在调用者中显式完成的,所以在创建
EnvironmentConditions
的任何地方都需要正确地重复构造代码。如果这些类发生变化,这将成为一个真正的问题

让我们假设
EnvironmentConditions
的定义需要另一个属性。这将要求更改此代码的每个实例以正确支持新属性。如果有“一堆代码”这样做,那么请求代码就有一堆原因需要更改,可能是因为不同的原因,在不同的时间,在不同的频率;服务和它的开发者真的需要担心这些吗?为什么不将输入对象传递到conditions类中,并将此代码更改立即应用到所有地方

public class EnvironmentConditions
{
    ...
    public EnvironmentConditions(EnvironmentConditionsInput input)
    {
        ConditionType = input.ConditionType;
        CoolingSetPointOccupied = input.CoolingSetPointOccupied ?? 0;
        CoolingSetPointUnOccupied = input.CoolingSetPointUnOccupied ?? 0;
        HeatingSetPointOccupied = input.HeatingSetPointOccupied ?? 0;
        RelativeHumidityMax = input.RelativeHumidityMax ?? 0;
        RelativeHumidityMin = input.RelativeHumidityMin ?? 0;
        // some new property
    }
}
// new EnvironmentConditions(spaceTypeInput.EnvironmentConditionsInput);
对于所有类似的代码和
SpaceType
也可以这样做。如果是这样,剩余的与空间相关的代码可以简单如下:

public class SpaceTypeServices
{
    public Guid CreateRequest(...)
    {    
        // rest  
        var spaceType = new SpaceType(spaceTypeInput);
        dbContext.SpaceTypes.Add(spaceType);
        dbContext.SaveChanges();
        return id;
    }
}
这是一种低影响、低工作量的重构,至少可以使代码更易于维护并降低复杂性

有人对如何重构有什么想法或建议吗 这些东西以更加面向对象的方法或通用的方式进行,这将非常有用 谢谢我

使用除无参数构造函数之外的任何东西构造对象都会使调用方承担一定程度的责任,以了解该对象的详细信息。对象构造越复杂,调用者的负担就越重。例如:

var environmentCondition = new EnvironmentConditions
{
    ConditionType = spaceTypeInput.EnvironmentConditionsInput.ConditionType,
    CoolingSetPointOccupied = spaceTypeInput.EnvironmentConditionsInput.CoolingSetPointOccupied ?? 0,
    CoolingSetPointUnOccupied = spaceTypeInput.EnvironmentConditionsInput.CoolingSetPointUnOccupied ?? 0,
    HeatingSetPointOccupied = spaceTypeInput.EnvironmentConditionsInput.HeatingSetPointOccupied ?? 0,
    RelativeHumidityMax = spaceTypeInput.EnvironmentConditionsInput.RelativeHumidityMax ?? 0,
    RelativeHumidityMin = spaceTypeInput.EnvironmentConditionsInput.RelativeHumidityMin ?? 0
};
这个例子表明,我们不仅要知道
EnvironmentConditions
依赖于
EnvironmentConditionsInput
(不是那么糟糕),而且还必须知道这两者的属性,更糟糕的是,我们必须执行错误检查/默认值。因为这是在调用者中显式完成的,所以在创建
EnvironmentConditions
的任何地方都需要正确地重复构造代码。如果这些类发生变化,这将成为一个真正的问题

让我们假设
EnvironmentConditions
的定义需要另一个属性。这将要求更改此代码的每个实例以正确支持新属性。如果有“一堆代码”这样做,那么请求代码就有一堆原因需要更改,可能是因为不同的原因,在不同的时间,在不同的频率;服务和它的开发者真的需要担心这些吗?为什么不将输入对象传递到conditions类中,并将此代码更改立即应用到所有地方

public class EnvironmentConditions
{
    ...
    public EnvironmentConditions(EnvironmentConditionsInput input)
    {
        ConditionType = input.ConditionType;
        CoolingSetPointOccupied = input.CoolingSetPointOccupied ?? 0;
        CoolingSetPointUnOccupied = input.CoolingSetPointUnOccupied ?? 0;
        HeatingSetPointOccupied = input.HeatingSetPointOccupied ?? 0;
        RelativeHumidityMax = input.RelativeHumidityMax ?? 0;
        RelativeHumidityMin = input.RelativeHumidityMin ?? 0;
        // some new property
    }
}
// new EnvironmentConditions(spaceTypeInput.EnvironmentConditionsInput);
对于所有类似的代码和
SpaceType
也可以这样做。如果是这样,剩余的与空间相关的代码可以简单如下:

public class SpaceTypeServices
{
    public Guid CreateRequest(...)
    {    
        // rest  
        var spaceType = new SpaceType(spaceTypeInput);
        dbContext.SpaceTypes.Add(spaceType);
        dbContext.SaveChanges();
        return id;
    }
}

这是一种低影响、低工作量的重构,至少可以使代码更易于维护并降低复杂性。

我认为您所拥有的一切都很好。如果你想让它变得难以理解、复杂,那么就使用模式。除非有可以重复使用的部件,否则我不会去管它,但即使这样,我也会问重复使用是否是“意外复制”。如果是意外复制,请别管它。@CodingYoshi我看起来像是在创建泛型方法,并将这些对象传递给方法,然后返回到相同类型的方法。。但有些我无法理解out@CodingYoshi,这样构造这些类型会使代码不必要地依赖于依赖对象的构造。照此,请求必须始终随这些类型而更改。这违反了SRP。1)你为什么要找那个?2) “创建通用消息”是什么意思?我修改了我的评论,很抱歉混淆了它的方法而不是消息。我认为你的评论是好的。如果你想让它变得难以理解、复杂,那么就使用模式。除非有可以重复使用的部件,否则我不会去管它,但即使这样,我也会问重复使用是否是“意外复制”。如果是意外复制,请别管它。@CodingYoshi我看起来像是在创建泛型方法,并将这些对象传递给方法,然后返回到相同类型的方法。。但有些我无法理解out@CodingYoshi,这样构造这些类型会使代码不必要地依赖于依赖对象的构造。照此,请求必须始终随这些类型而更改。这违反了SRP。1)你为什么要找那个?2) “创建通用消息”是什么意思?我修改了我的注释,很抱歉混淆了它的方法不是消息我需要参数l