我正在尝试将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);
然后得到这个错误:
依赖项的解析失败,输入=&#34; Services.IUserService&#34;, name =&#34;(none)&#34;。
我不确定为什么会这样说。我可能有MVC和构造函数的问题吗? Resolve行上的断点显示_container确实有我试图解析的接口。
我的UserService类在构造函数中有这个:
private IUserLogic _userlogic;
public UserService(IUserLogic logic)
{
_userlogic = logic;
}
逻辑层类的定义如下:
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接口以及要使用的具体类。
答案 0 :(得分:1)
您应该在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);
}
}
答案 1 :(得分:1)
UserLogic(IData data, ILog logger)
- IData
和ILog
都未显示为已在容器中注册 - 因此,如果代码与您在帖子中的完全相同,则IUserLogic
可以“当unity尝试将参数传递给UserService(IUserLogic)
构造函数时解析。
修复:注册所有依赖项(递归)
要实现这一点,请考虑:
int
/ string
(How resolve a dependency with unity passing arguments in the constructor?)