我有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都不应更改。“
答案 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。