Unity 容器无法解析我的 class
Unity container can't resolve my class
我正在尝试在我正在进行的学习项目中将 Unity 实现为 IoC 容器。我有一个分层应用程序,UI->Service->Logic->DataAccess。
它是 UI 端的 MVC 应用程序。
在我的控制器中,我有一个构造函数:
public HomeController()
{
_container = new UnityContainer();
_container.RegisterType<IUserService, UserService>();
_container.RegisterType<IUserLogic, UserLogic>();
}
然后我尝试在我的方法之一中使用 IService:
var service = _container.Resolve<IUserService>();
ReplyDto reply = service.Login(model.Email, model.Password);
但随后出现此错误:
Resolution of the dependency failed, type = "Services.IUserService",
name = "(none)".
我不确定为什么要这样说。我可能对 MVC 和构造函数有疑问吗? Resolve 行上的断点显示 _container 确实具有我正在尝试解析的接口。
我的 UserService class 在构造函数中有这个:
private IUserLogic _userlogic;
public UserService(IUserLogic logic)
{
_userlogic = logic;
}
逻辑层class定义如下:
public class UserLogic : IUserLogic
{
public ILog _logger;
public IData _data;
public UserLogic(IData data, ILog logger)
{
_data = data;
_logger = logger;
}
我仍在将 IoC 模式向下传播到所有层。
最后,数据访问层定义为:
public class Data :IData
{
Log _logger = new Log();
MyEntities entities;
public Data()
{
entities = new MyEntities();
var instance = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
}
我的 _container 引用了 IUserLogic 接口以及要使用的具体 class。
您应该在 Global.asax.cs
中注册容器
public class Global : HttpApplication
{
private void Application_Start(object sender, EventArgs e)
{
IUnityContainer container = new UnityContainer();
container.RegisterType<IUserService, UserService>();
container.RegisterType<IUserLogic, UserLogic>();
UnityDependencyResolver dependencyResolver = new UnityDependencyResolver(container);
GlobalConfiguration.Configuration.DependencyResolver = dependencyResolver;
DependencyResolver.SetResolver(dependencyResolver);
}
}
UserLogic(IData data, ILog logger)
- IData
和 ILog
均未显示为已在容器中注册 - 因此,如果代码与 post 中的代码完全相同,这就是为什么 IUserLogic
当 unity 尝试将参数传递给 UserService(IUserLogic)
构造函数时无法解析。
修复:注册所有依赖项(递归)
要实现这一目标,请考虑:
- 确保没有依赖关系的类型有没有参数的构造函数
- 注册实例而不是类型 - 如果这适用于您的系统
- 使构造函数依赖于具体类型(因为默认情况下所有具体类型都在 Unity 中注册)- 不可测试的选择...
- 为所有 non-interface/non class 参数提供参数,例如
int
/string
(How resolve a dependency with unity passing arguments in the constructor?)
我正在尝试在我正在进行的学习项目中将 Unity 实现为 IoC 容器。我有一个分层应用程序,UI->Service->Logic->DataAccess。
它是 UI 端的 MVC 应用程序。
在我的控制器中,我有一个构造函数:
public HomeController()
{
_container = new UnityContainer();
_container.RegisterType<IUserService, UserService>();
_container.RegisterType<IUserLogic, UserLogic>();
}
然后我尝试在我的方法之一中使用 IService:
var service = _container.Resolve<IUserService>();
ReplyDto reply = service.Login(model.Email, model.Password);
但随后出现此错误:
Resolution of the dependency failed, type = "Services.IUserService", name = "(none)".
我不确定为什么要这样说。我可能对 MVC 和构造函数有疑问吗? Resolve 行上的断点显示 _container 确实具有我正在尝试解析的接口。
我的 UserService class 在构造函数中有这个:
private IUserLogic _userlogic;
public UserService(IUserLogic logic)
{
_userlogic = logic;
}
逻辑层class定义如下:
public class UserLogic : IUserLogic
{
public ILog _logger;
public IData _data;
public UserLogic(IData data, ILog logger)
{
_data = data;
_logger = logger;
}
我仍在将 IoC 模式向下传播到所有层。
最后,数据访问层定义为:
public class Data :IData
{
Log _logger = new Log();
MyEntities entities;
public Data()
{
entities = new MyEntities();
var instance = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
}
我的 _container 引用了 IUserLogic 接口以及要使用的具体 class。
您应该在 Global.asax.cs
中注册容器 public class Global : HttpApplication
{
private void Application_Start(object sender, EventArgs e)
{
IUnityContainer container = new UnityContainer();
container.RegisterType<IUserService, UserService>();
container.RegisterType<IUserLogic, UserLogic>();
UnityDependencyResolver dependencyResolver = new UnityDependencyResolver(container);
GlobalConfiguration.Configuration.DependencyResolver = dependencyResolver;
DependencyResolver.SetResolver(dependencyResolver);
}
}
UserLogic(IData data, ILog logger)
- IData
和 ILog
均未显示为已在容器中注册 - 因此,如果代码与 post 中的代码完全相同,这就是为什么 IUserLogic
当 unity 尝试将参数传递给 UserService(IUserLogic)
构造函数时无法解析。
修复:注册所有依赖项(递归)
要实现这一目标,请考虑:
- 确保没有依赖关系的类型有没有参数的构造函数
- 注册实例而不是类型 - 如果这适用于您的系统
- 使构造函数依赖于具体类型(因为默认情况下所有具体类型都在 Unity 中注册)- 不可测试的选择...
- 为所有 non-interface/non class 参数提供参数,例如
int
/string
(How resolve a dependency with unity passing arguments in the constructor?)