我有一个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,并且需要一个新的Employee()实例,需要UserService实例。 如何在UserService中解决此新Employee()类的依赖关系。 另请注意,Employee类不实现任何接口。
如果需要进一步澄清,请回答或告诉我。我希望我能清楚地提出这个问题。
答案 0 :(得分:2)
您的依赖注入器可以(应该)只注入行为类(服务,处理程序,管理器等),它不能(不应该)注入数据持有者类(实体,poco等)。因此,您必须稍微更改设计,以便Employee
实例可以提供给IUserService
。
例如,您的IUserService
取决于可以注入的IEmployeeProvider
。并且您的员工提供者可以从您存储它的任何地方(数据库,会话)加载/检索员工到注入。这完全取决于您的应用程序决定使用哪个员工。
通常,你的组合根是在启动时创建的,之后不能(不应该)改变。
您的UsersController
是由DependencyResolver
直接创建的,此时您的员工尚未知晓。
答案 1 :(得分:0)
您只需在BuildUnityContainer
方法中注册所需的类型映射。
请参阅有关如何使用工厂方法或注册实例的统一文档。