gpt4 book ai didi

entity-framework - 使用 ASP.NET Web API 和 Entity Framework 进行 API 版本控制

转载 作者:行者123 更新时间:2023-12-04 12:22:38 27 4
gpt4 key购买 nike

我正在使用 ASP.NET Web API、Code-First Entity Framework 5 和 SQL Server 2012 开发 REST API,我需要能够对 API 进行版本控制。我已经阅读了一些关于在 URI 或自定义 HTTP header 中指示 API 版本并使用自定义 IHttpControllerSelector 根据指示的版本选择不同的 ApiControllers 的博客文章和文章。这都是有道理的。

我正在努力弄清楚如何管理超出 Web API 层的版本控制的影响,特别是在 Entity Framework 中。如何在不破坏旧版本 API 的情况下发展我的 DbContext?我也可以对 DbContext 进行版本控制吗?如果是这样,如何?

最佳答案

我最终做的是将 Repository Pattern 与 Pablo 的答案结合起来。其要点是我的 EF 模型是版本化的,我使用 EF Code-First Migrations 将数据库迁移到模型的新版本,我的 DbContext始终使用最新版本的模型,我开发了许多具体的存储库,每个存储库都实现了 IRepository<TItem>界面如下。

public interface IRepository<TItem> : IQueryable<TItem>, ICollection<TItem>, IDisposable
where TItem : class
{
void Update(TItem item);
void SaveChanges();
}
IRepository<TItem>的一种实现是 DbRepository<TItem>它包装了用于与数据库对话的 Entity Framework 代码。
public class DbRepository<TItem> : IRepository<TItem> 
where TItem : class
{
private MyDbContext _db;

public DbRepository()
{
_db = new MyDbContext();
}

// Implementation of IRepository<TItem> methods
}
IRepository<TItem> 的另一个实现是 TypeConversionRepository<TExternal,TInternal>这是一个抽象类,有助于从一种模型类型转换为另一种模型类型。
public abstract class TypeConversionRepository<TExternal, TInternal> : IRepository<TExternal>
where TExternal : class
where TInternal : class
{
protected IRepository<TInternal> InternalRepository { get; set; }

protected abstract TInternal ConvertInbound(TExternal externalItem);

protected abstract TExternal ConvertOutbound(TInternal internalItem);

// Implementation of IRepository<TItem> methods
}

返回模型或接受模型作为参数的方法使用 ConvertInbound()ConvertOutbound()转换 TExternal 类型的模型至 TInternal反之亦然。因此,给定以下 2 个版本的 MyModel ,我们可以写2个版本的MyModelRepository;版本 2 可以直接与数据库对话,而版本 1 需要从版本 2 转换回版本 1。
namespace Models.v1
{
public class MyModel
{
public int Id { get; set; }
public string MyProperty { get; set; }
}

public class MyModelRepository : TypeConversionRepository<Models.v1.MyModel,Models.v2.MyModel>
{
MyModelRepository()
{
this.InternalRepository = new Models.v2.MyModelRepository();
}

protected override TInternal ConvertInbound(TExternal externalItem)
{
return new Models.v2.MyModel
{
Id = externalItem.Id,
MyNewProperty = externalItem.MyProperty
};
}

protected override TExternal ConvertOutbound(TInternal internalItem)
{
return new Models.v1.MyModel
{
Id = internalItem.Id,
MyProperty = internalItem.MyNewProperty
};
}
}
}

namespace Models.v2
{
public class MyModel
{
public int Id { get; set; }
public string MyNewProperty { get; set; }
}

public class MyModelRepository : DbRepository<MyModel>
{

}
}

现在 v1 ApiController 可以使用 v1 MyModelRepository,v2 ApiController 可以使用 v2 MyModelRepository,但最终所有请求都使用已迁移到 v2 的数据库。

关于entity-framework - 使用 ASP.NET Web API 和 Entity Framework 进行 API 版本控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14857765/

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