如何将XML和SQL存储库之间进行动态切换在Web服务/网络API?(How to Switch D

2019-10-20 07:31发布

我有Web服务进行CRUD操作。 我有XMLProductRepository和SQLProductRepository实施IProductRepository接口。

现在我使用的存储库实例在我的Web服务的控制器来调用获取/把/ POST和删除它们在XMLRepository和SQLRepository分别定义的操作。 但我正在逐渐如何,我想我的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每当我的源改变不应该改变“。

Answer 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;
    }
}

在global.config称为bootstrapper.initialise():

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任何时候无需更改任何代码。



Answer 2:

如果你能分清哪些库是基于正在提交的HTTP动词来使用,可以配置可根据您的路线。 可以发现有关的更多细节这个问题 。



文章来源: How to Switch Dynamically between XML and SQL Repository in Web Service/ Web API?