您的位置:首页 > 移动开发 > Unity3D

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,代码如下:

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 Web API Unity