Asp.Net WebApi2中实现Unity的注入
2017-12-26 00:00
197 查看
阅读此文前请先掌握小白快速入手Asp.Net WebApi2
关于IOC的框架有很多,比如astle Windsor、Unity、Spring.NET、StructureMap、Autofac,我这边使用微软提供的Unity做示例。Unity是微软官方推荐使用的轻型IOC框架,支持各种方式的注入 ,是用来解耦的利器。获取Unity的方式可以直接下载对应的dll文件或者去对应的网站下载,我个人推荐用NuGet直接添加和管理。
1、NuGet安装Unity
如下图:
如果提示“Unity.Container”已拥有为“Unity.Abstractions”定义的依赖项,则需要将NuGet升级到最新,点击【工具】-【扩展和更新】,如下图:
更新NuGet,然后再重新安装Unity.AspNet.WebApi即可,如下图:
2、创建类库
1)在解决方案中创建IocProject.Model(实体模型层)、IocProject.Dao(数据访问层)、IocProject.Service(逻辑业务层)类库,如下图:
3、创建接口和实现
1)在IocProject.Model(实体模型层)创建实体类Product,代码如下:
2)在IocProject.Dao(数据访问层)中添加IocProject.Model层的引用,并创建ProductDao类和IProuctDao接口,代码如下:
3)在IocProject.Service(逻辑业务层)中添加IocProject.Model层和IocProject.Dao层的引用,并创建ProductService类和IProductService接口,代码如下:
4、修改控制器
在IocProject.WebApi中添加IocProject.Model层、IocProject.Dao层和IocProject.Service层的引用,修改控制器ProductController中的方法,代码如下:
5、依赖解析器
ASP.NET Web API定义了一个IDependencyResolever用来解析依赖项目,以下是这个接口的定义:
这个接口有两个方法:
1)GetService为一个类型创建一个实例;
2)GetServices为一个特定的类型创建一个实例集合
这个接口继承自IDependencyScope并且添加了BeginScope方法,在这篇文章接下来将讨论这个方法。
当ASP.NET Web API创建一个controller实例的时候,它首先调用IDependencyResolver的GetService方法,传回一个Controller实例,你可以使用一个扩展的钩子去创建控制器并且解析依赖。假如GetService方法返回NULL,ASP.NET Web API将查找一个无参的构造函数。
6、使用Unity解析依赖
虽然你可以重头开始写一个IDenpendencyResolver的实现,但是这个接口已经设计了可以作为ASP.NET Web API和IoC工具的桥梁。
IoC容器是一个用来管理依赖项目的组建,你可以在其中注册类型,在使用的时候创建对象,IoC容易自动解析出依赖的关系,许多IoC容器允许你在对象的生命周期中进行控制。
以下是一个使用Unity容器对IDependencyResolver的实现,在IocProject.WebApi下新建Models文件夹,并在文件夹下创建UnityResolver类,代码如下:
7、配置依赖解析
在全局的HttpConfiguration对象中DependencyResolver属性上设置依赖解析器,以下的代码使用Unity注册IProductDao和IProductService接口并且创建一个UnityResolver,在App_Start文件夹下UnityConfig类中创建Initialise方法,并修改WebApiConfig.cs中的Register方法,代码如下:
以上就是在WebApi2中实现了Unity的注入
8、运行项目
在浏览器Url后面加上“/api/product”查询所有的商品,加上“/api/product/2”查询单个商品,如下图:
使用Postman
关于IOC的框架有很多,比如astle Windsor、Unity、Spring.NET、StructureMap、Autofac,我这边使用微软提供的Unity做示例。Unity是微软官方推荐使用的轻型IOC框架,支持各种方式的注入 ,是用来解耦的利器。获取Unity的方式可以直接下载对应的dll文件或者去对应的网站下载,我个人推荐用NuGet直接添加和管理。
1、NuGet安装Unity
如下图:
如果提示“Unity.Container”已拥有为“Unity.Abstractions”定义的依赖项,则需要将NuGet升级到最新,点击【工具】-【扩展和更新】,如下图:
更新NuGet,然后再重新安装Unity.AspNet.WebApi即可,如下图:
2、创建类库
1)在解决方案中创建IocProject.Model(实体模型层)、IocProject.Dao(数据访问层)、IocProject.Service(逻辑业务层)类库,如下图:
3、创建接口和实现
1)在IocProject.Model(实体模型层)创建实体类Product,代码如下:
public class Product { public int Id { get; set; } public string Name { get; set; } public decimal Price { get; set; } }
2)在IocProject.Dao(数据访问层)中添加IocProject.Model层的引用,并创建ProductDao类和IProuctDao接口,代码如下:
public class ProductDao:IProductDao { public Product[] Products; public ProductDao() { Products = new Product[] { new Product(){ Id = 1, Name = "一箱橙子", Price = 58 }, new Product(){ Id = 2, Name = "三包薯片", Price = 18 }, new Product(){ Id = 3, Name = "五瓶可乐", Price = 15 } }; } /// <summary> /// 查询所有商品 /// </summary> /// <returns></returns> public IEnumerable<Product> GetProductList() { return Products; } /// <summary> /// 根据id查询商品 /// </summary> /// <param name="id"></param> /// <returns></returns> public Product GetProductById(int id) { return Products.FirstOrDefault(p => p.Id == id); } }
public interface IProductDao { /// <summary> /// 查询所有商品 /// </summary> /// <returns></returns> IEnumerable<Product> GetProductList(); /// <summary> /// 根据id查询商品 /// </summary> /// <param name="id"></param> /// <returns></returns> Product GetProductById(int id); }
3)在IocProject.Service(逻辑业务层)中添加IocProject.Model层和IocProject.Dao层的引用,并创建ProductService类和IProductService接口,代码如下:
public class ProductService:IProductService { public IProductDao _productDao; /// <summary> /// 构造器注入 /// </summary> /// <param name="productDao"></param> public ProductService(IProductDao productDao) { _productDao = productDao; } /// <summary> /// 查询所有商品 /// </summary> /// <returns></returns> public IEnumerable<Product> GetProductList() { return _productDao.GetProductList(); } /// <summary> /// 根据id查询商品 /// </summary> /// <param name="id"></param> /// <returns></returns> public Product GetProductById(int id) { return _productDao.GetProductById(id); } }
public interface IProductService { /// <summary> /// 查询所有商品 /// </summary> /// <returns></returns> IEnumerable<Product> GetProductList(); /// <summary> /// 根据id查询商品 /// </summary> /// <param name="id"></param> /// <returns></returns> Product GetProductById(int id); }
4、修改控制器
在IocProject.WebApi中添加IocProject.Model层、IocProject.Dao层和IocProject.Service层的引用,修改控制器ProductController中的方法,代码如下:
public class ProductController : ApiController { public IProductService _productService; /// <summary> /// 构造器注入 /// </summary> /// <param name="productService"></param> public ProductController(IProductService productService) { _productService = productService; } /// <summary> /// 查询所有商品 /// </summary> /// <returns></returns> public IEnumerable<Product> GetProductList() { return _productService.GetProductList(); } /// <summary> /// 根据id查询商品 /// </summary> /// <param name="id"></param> /// <returns></returns> public Product GetProductById(int id) { return _productService.GetProductById(id); } }
5、依赖解析器
ASP.NET Web API定义了一个IDependencyResolever用来解析依赖项目,以下是这个接口的定义:
public interface IDependencyResolver : IDependencyScope, IDisposable { IDependencyScope BeginScope(); } public interface IDependencyScope : IDisposable { object GetService(Type serviceType); IEnumerable<object> GetServices(Type serviceType); }
这个接口有两个方法:
1)GetService为一个类型创建一个实例;
2)GetServices为一个特定的类型创建一个实例集合
这个接口继承自IDependencyScope并且添加了BeginScope方法,在这篇文章接下来将讨论这个方法。
当ASP.NET Web API创建一个controller实例的时候,它首先调用IDependencyResolver的GetService方法,传回一个Controller实例,你可以使用一个扩展的钩子去创建控制器并且解析依赖。假如GetService方法返回NULL,ASP.NET Web API将查找一个无参的构造函数。
6、使用Unity解析依赖
虽然你可以重头开始写一个IDenpendencyResolver的实现,但是这个接口已经设计了可以作为ASP.NET Web API和IoC工具的桥梁。
IoC容器是一个用来管理依赖项目的组建,你可以在其中注册类型,在使用的时候创建对象,IoC容易自动解析出依赖的关系,许多IoC容器允许你在对象的生命周期中进行控制。
以下是一个使用Unity容器对IDependencyResolver的实现,在IocProject.WebApi下新建Models文件夹,并在文件夹下创建UnityResolver类,代码如下:
public class UnityResolver : IDependencyResolver { protected IUnityContainer container; public UnityResolver(IUnityContainer container) { if (container == null) { throw new ArgumentNullException("container"); } this.container = container; } public object GetService(Type serviceType) { try { return container.Resolve(serviceType); } catch (ResolutionFailedException) { return null; } } public IEnumerable<object> GetServices(Type serviceType) { try { return container.ResolveAll(serviceType); } catch (ResolutionFailedException) { return new List<object>(); } } public IDependencyScope BeginScope() { var child = container.CreateChildContainer(); return new UnityResolver(child); } public void Dispose() { container.Dispose(); } }
7、配置依赖解析
在全局的HttpConfiguration对象中DependencyResolver属性上设置依赖解析器,以下的代码使用Unity注册IProductDao和IProductService接口并且创建一个UnityResolver,在App_Start文件夹下UnityConfig类中创建Initialise方法,并修改WebApiConfig.cs中的Register方法,代码如下:
public static class UnityConfig { /// <summary> /// 注册接口和实现 /// </summary> /// <param name="config"></param> public static void Initialise(HttpConfiguration config) { var container = new UnityContainer(); container.RegisterType<IProductDao, ProductDao>(); container.RegisterType<IProductService, ProductService>(); config.DependencyResolver = new UnityResolver(container); } }
public static class WebApiConfig { public static void Register(HttpConfiguration config) { UnityConfig.Initialise(config); //注册接口和实现 config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); } }
以上就是在WebApi2中实现了Unity的注入
8、运行项目
在浏览器Url后面加上“/api/product”查询所有的商品,加上“/api/product/2”查询单个商品,如下图:
使用Postman
相关文章推荐
- ASP.NET MVC Unity实现依赖注入
- Asp.Net WebApi2中实现Autofac的注入
- 使用Unity 实现ASP.NET Web API 依赖注入
- 【ASP.NET Core】依赖注入高级玩法——如何注入多个服务实现类
- ASP.NET Web Application 中使用 Unity 依赖注入容器
- 使用Autofac在ASP.NET Web API上实现依赖注入
- 自定义IHttpHandlerFactory使用Unity对ASP.NET Webform页面进行依赖注入
- ASP.NET Core依赖注入多个服务实现类
- [ASP.NET MVC 小牛之路]05 - 使用 Ninject实现依赖注入
- 【懒人有道】在asp.net core中实现程序集注入
- ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)
- 使用Autofac在ASP.NET Web API上实现依赖注入
- Asp.Net Core 项目实战之权限管理系统(4) 依赖注入、仓储、服务的多项目分层实现
- Asp.Net Mvc使用Autofac实现依赖注入
- ASP.NET MVC 中使用Spring.NET实现简单的属性注入
- 扩展ASP.NET MVC三层框架且使用StructureMap实现依赖注入1-Model层
- ASP.NET MVC Ninject 实现依赖注入
- 扩展ASP.NET MVC三层框架且使用StructureMap实现依赖注入1-Model层
- [Unity3d]unity+asp.net实现动态搜索加载模型并且能够实现模型拖动缩放的功能