C# 如何使用Unity容器解析Web API中依赖项的依赖项?
我有一个web API控制器,我使用Unity.WebAPI来解决依赖关系。 下面是我的Bootstrapper.cs代码C# 如何使用Unity容器解析Web API中依赖项的依赖项?,c#,asp.net-web-api,unity-container,C#,Asp.net Web Api,Unity Container,我有一个web API控制器,我使用Unity.WebAPI来解决依赖关系。 下面是我的Bootstrapper.cs代码 public static class Bootstrapper { /// <summary> /// Public method to initialise UnityContainer. /// </summary> public static void Initialise() { va
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也依赖于任何其他类,比如Employee,并且需要一个新的Employee()实例,而不需要UserService实例。
如何在UserService中解析这个新Employee()类的依赖关系。
还要注意Employee类没有实现任何接口
请回答,或让我知道如果任何进一步的澄清是必要的。我希望我问得很清楚。您的依赖注入程序只能(应该)注入行为类(服务、处理程序、管理器等),不能(不应该)注入数据持有者类(实体、poco等)。因此,您必须稍微更改一下设计,以便将
Employee
实例提供给您的IUserService
例如,您的IUserService
可以依赖于可以注入的IEmployeeProvider
。您的员工提供者可以从存储员工的任何位置(数据库、会话)加载/检索要注入的员工。这完全取决于应用程序在何处决定使用哪个员工
通常,您的合成根目录是在启动时创建的,之后不能(不应该)更改
您的
UsersController
是由DependencyResolver
直接创建的,此时您的员工还不知道。您只需在BuildUnityContainer
方法中注册所需的类型映射即可
有关如何使用factory方法或注册实例,请参阅unity文档。请建议必须编写哪些代码以及在何处编写代码?有关注册类型映射和如何注册实例,请参阅不要被Employee类的名称混淆,它可以是任何类XYZ。我想要的是,当我的UserService被实例化时,我想要UserService所依赖的那个XYZ类也被实例化。在哪里以及如何编写代码?你必须在容器中注册它,就像你在
IUserService
注册时一样。
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;
}