在将 Ninject 与 ASP.NET MVC 结合使用时,抽象出第 3 方依赖项的最佳方法是什么?
通常,我会这样做:
public interface IProductRepository
{
IEnumerable<Product> GetProducts();
}
public class ProductRespository : IProductRepository
{
public IEnumerable<Product> GetProducts()
{
...
}
}
然后在 Controller 中:
public class ProductController : Controller
{
private IProductRepository repository;
public ProductController(IProductRepository repository)
{
this.repository = repository;
}
...
}
然后我使用 Ninject 自动将实体 ProductRepository 注入(inject) Controller 。
但是如果依赖项是第 3 方,我该怎么做呢?例如,我正在使用 FlickrNet .
public class ProductController : Controller
{
private Flickr flickr;
...
}
我希望能够将 Flickr
对象抽象到一个接口(interface)中,这样我就可以使用依赖注入(inject)并使单元测试更容易。我知道我可以创建一个“服务”类型的接口(interface),然后实现一个基于将包装 Flickr 对象的类。
但我必须在与 Flickr 对象的每个成员相对应的接口(interface)中定义一个成员,然后将每个成员映射到包装器对象中。 Flickr 对象中有很多很多成员。
有没有更好的方法来处理这个问题?我的主要目标是在单元测试中轻松模拟 Flickr 依赖项。
最佳答案
将我的评论升级为答案。
这不是 DI 的问题,而是一般的架构问题。您可以将 Controller 声明为您的抽象层,也可以在实现自定义接口(interface)的 flickr 组件周围定义一个包装器。如果您的第 3 方组件上的方法使用更多的第 3 方类,您也需要将它们抽象掉,依此类推,直到您只剩下原始值或更多围绕第 3 方代码的包装器。根据该组件的复杂性,这可能意味着大量映射和包装。
关于asp.net-mvc - 我如何处理抽象出第 3 方依赖项(依赖注入(inject))?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11874403/