如何使用UnityContainer解决Web API中依赖项的依赖关系
本文关键字:依赖 关系 API 何使用 UnityContainer 解决 Web | 更新日期: 2023-09-27 18:26:38
我有一个web API控制器,我使用Unity.WebAPI来解决依赖关系。以下是我的Bootstrapper.cs代码,
public static class Bootstrapper
{
/// <summary>
/// Public method to initialise UnityContainer.
/// </summary>
public static void Initialise()
{
var container = BuildUnityContainer();
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
// register dependency resolver for WebAPI RC
GlobalConfiguration.Configuration.DependencyResolver = new Unity.WebApi.UnityDependencyResolver(container);
}
/// <summary>
/// Register built in types.
/// </summary>
/// <returns></returns>
private static IUnityContainer BuildUnityContainer()
{
var container = new UnityContainer();
container.RegisterType<IUserService, UserService>().RegisterType<UnitOfWork>(new HierarchicalLifetimeManager());
return container;
}
}
这将我的UserService解析为我的UsersController,我的控制器代码是
private readonly IUserService _userService;
/// <summary>
/// Public constructor to initialize user service instance
/// </summary>
/// <param name="userService"></param>
/// <param name="tokenService"> </param>
public UsersController(IUserService userService)
{
_userService = userService;
}
现在假设我的UserService也依赖于任何其他类,比如Employee,并且在需要UserService实例时也需要一个新的Employee()实例。如何解决UserService中这个新Employee()类的依赖关系。还要注意,Employee类没有实现任何接口。
请回答,或者如果需要进一步澄清,请告诉我。我希望我能清楚地提出这个问题。
依赖项注入器只能(应该)注入行为类(服务、处理程序、管理器等),不能(不应该)注入数据持有者类(实体、poco等)。因此,您必须稍微更改一下设计,以便将Employee
实例提供给IUserService
。
例如,您的IUserService
可以依赖于可以注入的IEmployeeProvider
。您的员工提供者可以从您存储的任何位置(数据库、会话)加载/检索要注入的员工。这完全取决于您的应用程序在哪里决定使用哪个员工。
通常,您的组合根是在启动时创建的,之后不能(不应该)更改。
您的UsersController
是由DependencyResolver
直接创建的,此时您的员工还不为人所知。
您只需在BuildUnityContainer
方法中注册所需的类型映射。
请参阅有关如何使用工厂方法或注册实例的统一文档。