asp.net-mvc - 我如何处理抽象出第 3 方依赖项(依赖注入(inject))?

标签 asp.net-mvc unit-testing architecture dependency-injection ninject

在将 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/

相关文章:

c# - 指定服务器端代码的相对路径

ASP.NET 身份数据库第一个自定义用户和角色

python - 在哪里保存 Python 单元测试?

java - 丰富的文件系统

c# - 在 BLL、DAL 或 PL 中,我应该在哪里处理异常?

c# - 未设置 ASP.NET Core 2.0 身份验证 Cookie

asp.net-mvc - 从 OnActionExecuting 重定向到外部 url?

c# - Rhino Mocks - 通过多次调用模拟其返回值发生变化(即使传递相同参数)的方法

python - 我想模拟打开一个现有的测试文件,对其应用一个函数进行测试,但不更改文件的实际内容

architecture - 在不同的端口上设置健康检查地址而不是使用不同的路径有什么好处?