Unity容器无法解析我的课程

时间:2016-09-18 00:51:23

标签: c# .net asp.net-mvc inversion-of-control unity-container

我正在尝试将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接口以及要使用的具体类。

2 个答案:

答案 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) - IDataILog都未显示为已在容器中注册 - 因此,如果代码与您在帖子中的完全相同,则IUserLogic可以“当unity尝试将参数传递给UserService(IUserLogic)构造函数时解析。

修复:注册所有依赖项(递归)

要实现这一点,请考虑:

  • 确保没有依赖项的类型具有不带参数的构造函数
  • 注册实例而不是类型 - 如果适用于您的系统
  • make构造函数依赖于具体类型(默认情况下,所有具体类型都在Unity中注册) - 不是可测试的选择......
  • 为所有非接口/非类参数提供参数,例如int / stringHow resolve a dependency with unity passing arguments in the constructor?