【发布时间】:2015-09-14 14:59:01
【问题描述】:
我有 XMLProductRepository 和 SQLProductRepository。现在我怎么能在它们之间动态切换。我是 DI 的新手。所以在谷歌上搜索相同的内容并找到了一个讨论一下的链接。但仍然不明白存储库将在什么基础上更改以及如何更改。这是代码
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) {}
}
Unity.Mvc3 is using as Di
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;
}
}
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;
}
我了解动态 SQLProductRepository 实例正在注入控制器的代码。所以我的问题是如何注入XMLProductRepository?
我想以这种方式设计一些基于 url 依赖的东西将被注入。 如何实现它。寻找指导线。谢谢
【问题讨论】:
-
为什么需要在两个存储库之间动态切换?
-
与@Steven。这完全不是依赖注入的用途。
-
@CodeCaster:是的,但在实践中,我发现真的不太可能在运行时更改实体的存储机制。更有可能需要在应用程序启动时设置存储机制,或者通过在运行时使用装饰器或拦截器包装实现来添加横切关注点(例如日志记录和审计跟踪)。
-
@Steven 看起来 OP 实际上不需要存储库可以互换。你通常需要它来进行单元测试。在这里,使用 DI 注入
IXmlRepository和IDatabaseRepository似乎是一种更明智的做法。 -
@CodeCaster,我宁愿说 SqlProductRepository 应该在你的容器中配置(如果有的话),而 XmlProductRepository 应该在需要它的单元测试中手动注入。
标签: asp.net-mvc dependency-injection repository-pattern