如何在Web服务/ Web API中动态切换XML和SQL存储库
本文关键字:Web XML SQL 存储 服务 API 动态 | 更新日期: 2023-09-27 18:08:58
我有Web Service来进行CRUD操作。我有一个由XMLProductRepository和SQLProductRepository实现的IProductRepository接口。
现在我使用web服务控制器中的存储库实例来调用分别在XMLRepository和SQLRepository中定义的Get/Put/POST和Delete操作。但是我有点困惑,如何在这两个存储库之间动态变化,因为我想让我的web服务数据库不可知
public interface IProductRepository
{
IEnumerable<Product> GetAll();
Product Get(int id);
Product Add(Product item);
void Remove(int id);
bool Update(Product item);
}
public class XMLProductRepository : IProductRepository
{
public XMLProductRepository() {}
public IEnumerable<Product> GetAll() {}
public Product Get(int id) {}
public Product Add(Product item) {}
public void Remove(int id) {}
public bool Update(Product item) {}
}
public class SQLProductRepository : IProductRepository
{
public SQLProductRepository() {}
public IEnumerable<Product> GetAll() {}
public Product Get(int id) {}
public Product Add(Product item) {}
public void Remove(int id) {}
public bool Update(Product item) {}
}
public class ProductController : ApiController
{
static readonly IProductRepository repository = new XMLProductRepository();
// REST OF THE CODE AND IMPLEMENTATION HERE...
// using the repository object
}
问题是我如何使它动态在这里,而不是在控制器中定义特定的存储库对象?或者问题是,我能对这个WEB API这样做吗?
让我进一步详细说明这个问题-感谢Dillie-O指出这一点。
我得到的要求是"源是互斥的。在任何时候,服务都只能从一个源(XML或SQL)中获取信息。服务应该能够在客户端不知情的情况下在源之间切换。除此之外,Service WEB API不应该在我的源代码更改时更改。"
进入mvc项目并添加nuget包Unity。Mvc3或mvc4基于您的项目。这将在项目中带来一个名为Bootstrapper.cs的类。在这里添加您的类型,如下所示:
public static class Bootstrapper
{
public static void Initialise()
{
var container = BuildUnityContainer();
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
}
private static IUnityContainer BuildUnityContainer()
{
var container = new UnityContainer();
//Register the repository
container.RegisterType<IProductRepository, SQLProductRepository>();
return container;
}
}
在全局。配置调用bootstrapper. initialize ():
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
AuthConfig.RegisterAuth();
Bootstrapper.Initialise();
}
你现在可以这样设置控制器:
public class HomeController : Controller
{
private readonly IProductRepository productRepository;
public HomeController(IProductRepository productRepository)
{
this.productRepository = productRepository;
}
和正确的类型将被发送。你可以在bootstrapper.cs中随时更改实现,而无需更改任何代码。
如果您可以根据提交的HTTP谓词区分要使用哪个存储库,则可以基于此配置路由。