如何使用Unity Container解决Web API中依赖项的依赖性?

时间:2014-10-15 12:44:45

标签: 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()
    {
        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,并且需要一个新的Employee()实例,需要UserService实例。 如何在UserService中解决此新Employee()类的依赖关系。 另请注意,Employee类不实现任何接口。

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

2 个答案:

答案 0 :(得分:2)

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

例如,您的IUserService取决于可以注入的IEmployeeProvider。并且您的员工提供者可以从您存储它的任何地方(数据库,会话)加载/检索员工到注入。这完全取决于您的应用程序决定使用哪个员工。

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

您的UsersController是由DependencyResolver直接创建的,此时您的员工尚未知晓。

答案 1 :(得分:0)

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

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