如何在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不应该在我的源代码更改时更改。"

如何在Web服务/ Web API中动态切换XML和SQL存储库

进入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谓词区分要使用哪个存储库,则可以基于此配置路由。