ASP.NET Web API中的依赖注入
2020-11-26 11:07
标签:style class c tar ext color 什么是依赖注入 ASP.NET Web API中的依赖注入,搜素材,soscw.com ASP.NET Web API中的依赖注入 标签:style class c tar ext color 原文地址:http://www.cnblogs.com/haosola/p/3724512.html
依赖,就是一个对象需要的另一个对象,比如说,这是我们通常定义的一个用来处理数据访问的存储,让我们用一个例子来解释,首先,定义一个领域模型如下:
namespace
Pattern.DI.MVC.Models
{
public class
Product
{
public int Id { get; set; }
public
string Name { get; set; }
public decimal Price { get; set;
}
}
}
然后是一个用于实例的简单存储类:
namespace
Pattern.DI.MVC.Models
{
public class
ProductContext
{
public List
public
ProductContext()
{
Products.Add(new Product() {Id = 1,
Name = "苍阿姨", Price = 100});
Products.Add(new Product() {Id = 2, Name
= "武藤奶奶", Price = 200});
Products.Add(new Product() {Id = 3, Name =
"小泽姐姐", Price = 300});
}
}
public class
ProductRepository
{
private ProductContext context=new
ProductContext();
public IEnumerable
{
return
context.Products;
}
public Product GetById(int
id)
{
return context.Products.FirstOrDefault(p => p.Id
== id);
}
}
}
现在,我们定义一个ASP.NET Web
API控制器来支持对Product实体集的GET请求:
namespace
Pattern.DI.MVC.Controllers
{
public class
ProductController : ApiController
{
private readonly
ProductRepository productRepository=new ProductRepository();
public
IEnumerable
{
return
productRepository.GetAll();
}
public Product Get(int
id)
{
return
productRepository.GetById(id);
}
}
}
现在注意到,这个控制器依赖了"ProductRepository"这个类,我们在类中实例化了ProductRepository,这就是设计的"坏味道"了,因为如下几个原因:
假如你想要使用另外一个实现替换ProductRepository,你还要去修改ProductController类;
假如ProductRepository存在依赖,你必须在ProductController中配置他们,对于一个拥有很多控制器的大项目来说,你就配置工作将深入到任何可能的地方;
这是很难去做单元测试的因为控制器中硬编码了对数据库的查询,对于一个单元测试,你可以在没有确切设计之前,使用一个仿制的桩存储体。
我们可以使用注入一个ProductRepsoitory来解决这个问题,首先重构ProductRepository的方法到一个接口中:
namespace
Pattern.DI.MVC.Models
{
public interface
IProductRepository
{
IEnumerable
Product GetById(int id);
}
public
class ProductRepository:IProductRepository
{
private
ProductContext context = new ProductContext();
public
IEnumerable
{
return
context.Products;
}
public Product GetById(int
id)
{
return context.Products.FirstOrDefault(p => p.Id
==
id);
}
}
}
然后在ProductC0ntroller中使用参数传入IProductRepository:
namespace
Pattern.DI.MVC.Controllers
{
public class
ProductController : ApiController
{
private readonly
IProductRepository productRepository;
public
ProductController(IProductRepository
productRepository)
{
this.productRepository =
productRepository;
}
public IEnumerable
{
return
productRepository.GetAll();
}
public Product Get(int
id)
{
return
productRepository.GetById(id);
}
}
}
这个示例使用了构造器注入,你同样可以使用设置器注入的方式,ASP.NET
Web
API在为请求映射了路由之后创建控制器,而且现在他不知道任何关于IProductRepository的细节,这是通过API依赖器解析到的。
ASP.NET
Web API依赖解析器
ASP.NET Web
API定义了一个IDependencyResolever用来解析依赖项目,以下是这个接口的定义:
public interface
IDependencyResolver : IDependencyScope,
IDisposable
{
IDependencyScope
BeginScope();
}
public interface IDependencyScope :
IDisposable
{
object GetService(Type
serviceType);
IEnumerable