本文主要介绍Unity实现依赖注入的步骤,不涉及实现原理
unity框架下载
实体类
namespace WebApi.Models
{
public class User
{
public int UserId { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
}
}
接口
namespace WebApi.Unity.Interface
{
public interface IUserService
{
List<User> GetUsers();
}
}
实现类
namespace WebApi.Unity.Service
{
public class UserService : IUserService
{
public List<User> GetUsers()
{
return new List<User>
{
new User
{
UserId = 1,
UserName = "Test",
Password = "Test",
},
new User
{
UserId = 2,
UserName = "Test2",
Password = "Test2",
},
new User
{
UserId = 3,
UserName= "Test3",
Password = "Test3"
}
};
}
}
}
配置文件(项目下新建CfgFiles文件夹,添加Unity.config配置文件)
其中ContainerAOP为容器名字,可自定义
register为映射关系,type为对象的名称,mapTo为注入对象的名称 写法为用逗号隔开两部分,一是类的全部,包括命名空间,二是程序集名称
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Unity.Configuration"/>
</configSections>
<unity xmlns="http://schemas.microsoft.com/practces/2010/unity">
<containers>
<container name="ContainerAOP">
<register type="WebApi.Unity.Context.DbContext,WebApi"
mapTo="WebApi.Unity.Context.UserDbContext,WebApi"/>
<register type="WebApi.Unity.Interface.IUserService,WebApi"
mapTo="WebApi.Unity.Service.UserService,WebApi"/>
</container>
</containers>
</unity>
</configuration>
容器工厂
其中fileMap.ExeConfigFilename获取配置文件的路径,代码对应的配置文件位置为
其中section.Configure(_Container, "ContainerAOP");第二个参数为配置文件中的容器名称
namespace WebApi.Unity
{
public class UnityContainerFactory
{
private static IUnityContainer _Container= null;
static UnityContainerFactory()
{
Console.WriteLine("*************************UnityContainer********************");
ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory + "CfgFiles\\Unity.Config");//找配置文件的路径
Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
UnityConfigurationSection section = (UnityConfigurationSection)configuration.GetSection(UnityConfigurationSection.SectionName);
_Container = new UnityContainer();
section.Configure(_Container, "ContainerAOP");
}
public static IUnityContainer GetContainer()
{
return _Container;
}
}
}
UnityDependencyResolver(自定义容器)
namespace WebApi.Unity
{
public class UnityDependencyResolver : IDependencyResolver
{
private IUnityContainer _IUnityContainer = null;
public UnityDependencyResolver(IUnityContainer unityContainer)
{
this._IUnityContainer = unityContainer;
}
/// <summary>
/// 每次请求
/// </summary>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
public IDependencyScope BeginScope()
{
var child = this._IUnityContainer.CreateChildContainer();
return new UnityDependencyResolver(child);
}
/// <summary>
/// 销毁
/// </summary>
public void Dispose()
{
this._IUnityContainer.Dispose();
}
/// <summary>
/// 获取单个服务
/// </summary>
/// <param name="serviceType"></param>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
public object GetService(Type serviceType)
{
try
{
return this._IUnityContainer.Resolve(serviceType);
}
catch(ResolutionFailedException)
{
return null;
}
}
/// <summary>
/// 获取所有服务
/// </summary>
/// <param name="serviceType"></param>
/// <returns></returns>
public IEnumerable<object> GetServices(Type serviceType)
{
try
{
return this._IUnityContainer.ResolveAll(serviceType);
}
catch (ResolutionFailedException)
{
return new List<object>();
}
}
}
在WebApiConfig里配置容器
config.DependencyResolver = new UnityDependencyResolver(UnityContainerFactory.GetContainer());
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API 配置和服务
config.DependencyResolver = new UnityDependencyResolver(UnityContainerFactory.GetContainer());
// Web API 路由
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
以上就完成了,在控制器进行调用(此时不用自己去new对象,容器会自动注入service)
public class UsersController : ApiController
{
private IUserService _iUserService;
public UsersController(IUserService userService)
{
this._iUserService = userService;
}
public IEnumerable<User> Get()
{
var list = this._iUserService.GetUsers();
return list;
}
}