如何返回松散类型的对象?

时间:2017-12-20 20:10:27

标签: c# .net asp.net-web-api asp.net-web-api2 visual-studio-2017

当数据库架构发生变化时,我们如何避免破坏控制器方法的变化?

假设我正在返回一个对象:

public class Bike
{
   public int Wheels {get;}
   public int Id {get;}
}

在以下控制器中:

public class BikeController
{
    [HttpGet]
    public List<Bike> Get([FromBody] MyRequest request)
    {
        var context = new DbContext(_repository.Database.Connection.ConnectionString);
        var procedure = request;
        return context.Database.ExecuteStoredProcedure<Bike>(procedure).ToList();
    }
}

在某些时候,数据库代码会发生变化。 我不想在C#中重新定义Bike模式。

当数据库架构发生变化时,我们如何更改Bike控制器方法的签名,以便不进行任何重大更改?

我正在寻找以下内容:

public IHttpActionResult Get()
{
    var context = new DbContext(_repository.Database.Connection.ConnectionString);
    var procedure = request;
    return context.Database.ExecuteStoredProcedure<object>(procedure).ToList();
}

4 个答案:

答案 0 :(得分:3)

我不明白为什么你的控制器根本需要改变,因为你只是直接返回检索到的类型而没有在你的action方法中引用它的任何属性。

此外,当您返回单个.ToList()对象时,为什么要调用Bike。此外,您可以考虑使用Model或ViewModel,而不是直接返回实体作为选项。

@Evk已经指出新添加的属性在反序列化时会丢失但是如果你想返回一个抽象对象,那么你可以让所有实体继承自具有公共属性的BaseEntity并返回

BaseEntity obj = context.Database.ExecuteStoredProcedure<Bike>(procedure);
returb obj;

答案 1 :(得分:1)

我认为你有几个选择:

  1. 返回dynamic而不是Bike。但是,这会对dynamic个对象的所有用户产生性能影响。

  2. 返回object而不是Bike

  3. 但在这两种情况下,您的Bike存储过程仍将返回与Bike对象不兼容的更新数据,因此您仍需要重新编译控制器。

    1. 返回表示BikeController响应的标准对象,并匹配存储过程响应。
    2. 考虑如何在SQL中处理数据库更新 - 您的SELECT语句指定了您需要的确切列,并且不受不影响返回列的架构更改的影响,或者如果您使用*则忽略任何列你不需要,这不利于强类型或ORM。

答案 2 :(得分:1)

只要您不访问任何属性或使用任何方法,它的存在依赖于架构对象或与数据库相关的任何内容您是安全的。 使控制器与数据库模式无关,将使得由于数据库端的更改而不太可能更改此控制器,这就是Data Access layers的原因。 我认为如果我们应用了关注点分离原则,我们会发现处理数据库不是Controller责任,这必须通过某种Brokers来完成,就像注入到数据库中的存储库接口类型一样。控制器构造函数。控制器只会看到插入,更新,删除方法,但它对数据库没有任何了解。 此外,它不是一个松散类型的对象。它是一种松散耦合的类型,你真正需要它。

答案 3 :(得分:1)

您只是从数据库中检索对象,对象内部的属性数量不会影响或破坏您的ActionMethod。

如果您仍然担心对象内的属性不是您想要在视图上呈现的原因,那么您可以使用ViewModel并使用您的Bike对象属性来填充视图模型并改为渲染视图模型。 / p>