如何使用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;


/// &lt;summary&gt;
/// Public constructor to initialize user service instance
/// &lt;/summary&gt;
/// &lt;param name=&quot;userService&quot;&gt;&lt;/param&gt;
/// &lt;param name=&quot;tokenService&quot;&gt; &lt;/param&gt;
public UsersController(IUserService userService)
{
    _userService = userService;
}

现在假设我的UserService也依赖于任何其他类,比如Employee,并且在需要UserService实例时也需要一个新的Employee()实例。如何解决UserService中这个新Employee()类的依赖关系。还要注意,Employee类没有实现任何接口。

请回答,或者如果需要进一步澄清,请告诉我。我希望我能清楚地提出这个问题。

如何使用UnityContainer解决Web API中依赖项的依赖关系

依赖项注入器只能(应该)注入行为类(服务、处理程序、管理器等),不能(不应该)注入数据持有者类(实体、poco等)。因此,您必须稍微更改一下设计,以便将Employee实例提供给IUserService

例如,您的IUserService可以依赖于可以注入的IEmployeeProvider。您的员工提供者可以从您存储的任何位置(数据库、会话)加载/检索要注入的员工。这完全取决于您的应用程序在哪里决定使用哪个员工。

通常,您的组合根是在启动时创建的,之后不能(不应该)更改。

您的UsersController是由DependencyResolver直接创建的,此时您的员工还不为人所知。

您只需在BuildUnityContainer方法中注册所需的类型映射。

请参阅有关如何使用工厂方法或注册实例的统一文档。