如何在Web Service / Web API中的XML和SQL存储库之间动态切换?

时间:2014-06-17 19:42:09

标签: c# web-services asp.net-web-api repository-pattern

我有Web服务来进行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信息。服务应该能够在没有客户知识的情况下在源之间切换。除此之外每当我的源更改时,服务WEB API都不应更改。“

2 个答案:

答案 0 :(得分:1)

转到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.initialise()的global.config中:

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中更改实现,而无需更改任何代码。

答案 1 :(得分:0)

如果您可以根据提交的HTTP谓词来区分要使用的存储库,则可以根据该配置来配置路由。有关详细信息,请参阅this question