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) - IDataILog 均未显示为已在容器中注册 - 因此,如果代码与 post 中的代码完全相同,这就是为什么 IUserLogic 当 unity 尝试将参数传递给 UserService(IUserLogic) 构造函数时无法解析。

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

要实现这一目标,请考虑:

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