【问题标题】:unity dependency error -make sure that the controller has a parameterless public constructor统一依赖错误 - 确保控制器有一个无参数的公共构造函数
【发布时间】:2019-04-17 09:37:52
【问题描述】:

抱歉,我是 IOC 概念的新手。我一直在尝试在我的 web api 项目中实现 Unity.WebAPI (5.3.0.),但出现以下错误;

  • 尝试创建“TransactionController”类型的控制器时出错。确保控制器有一个无参数的公共构造函数

UnityResolver 类

    public class UnityResolver : IDependencyResolver
    {
    protected IUnityContainer container;

    public UnityResolver(IUnityContainer container)
    {
        if (container == null)
        {
            throw new ArgumentNullException("container");
        }
        this.container = container;
    }

    public object GetService(Type serviceType)
    {
        try
        {
            return container.Resolve(serviceType);
        }
        catch (ResolutionFailedException)
        {
            return null;
        }
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        try
        {
            return container.ResolveAll(serviceType);
        }
        catch (ResolutionFailedException)
        {
            return new List<object>();
        }
    }

    public IDependencyScope BeginScope()
    {
        var child = container.CreateChildContainer();
        return new UnityResolver(child);
    }

    public void Dispose()
    {
        container.Dispose();
    }
}

Web API 配置

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        var container = new UnityContainer();

        // register all your components with the container here
        // it is NOT necessary to register your controllers

        // e.g. container.RegisterType<ITestService, TestService>();

        container.RegisterType<IFService, FService>(new HierarchicalLifetimeManager());
        container.RegisterType<IMService, MService>(new HierarchicalLifetimeManager());
        container.RegisterType<ITransactionService, TransactionService>(new HierarchicalLifetimeManager());
        container.RegisterType<IMRepository, MRepository>();

        config.DependencyResolver = new UnityResolver(container);
    }
}

Global.asax

 protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }

控制器

    public class TransactionController : ApiController
{
    private readonly ITransactionService _transactionService;
    private readonly IMService _mService;

    /// <summary>
    /// Public constructor to initialize transaction service instance
    /// </summary>
    public TransactionController(ITransactionService transactiontService, IMService mService)
    {
        _mService = mService;
        _transactionService = transactiontService;
    }

    [HttpGet]
    public IHttpActionResult IsApiAlive()
    {

        return Ok();

    }

TransactionService 类构造函数

private readonly IMRepository _mRepository;      

public TransactionService(IMRepository mRepository)
    {
        _mRepository = mRepository;
    }

【问题讨论】:

  • 检查以确保对象图的所有依赖项都已注册,以便正确解析它们
  • 这些注册的服务实现本身是否有依赖关系?您很可能缺少依赖项注册。
  • 一个服务确实会创建另一个服务的实例
  • 在构造函数中设置断点,看看它们是否正确注入了各自的依赖项。

标签: c# api asp.net-web-api


【解决方案1】:

检查以确保对象图的所有依赖项都已注册,以便正确解析它们。

您很可能缺少依赖项注册。

对于TransactionService,您在构造函数中传递/注入实现

public TransactionService(MRepository mRepository, FService fService) {
    _mRepository = mRepository;
    _fservice = fService;
}

而您只注册了接口。

container.RegisterType<IFService, FService>(new HierarchicalLifetimeManager());
container.RegisterType<IMService, MService>(new HierarchicalLifetimeManager());
container.RegisterType<ITransactionService, TransactionService>(new HierarchicalLifetimeManager());
container.RegisterType<IMRepository, MRepository>();

解析器将根据已知的依赖关系对实现进行实际初始化和注入。

改变

public TransactionService(MRepository mRepository, FService fService) 

依赖注册的接口

private readonly IMRepository mRepository;
private readonly IFService fService;

public TransactionService(IMRepository mRepository, IFService fService) {
    this.mRepository = mRepository;
    this.fservice = fService;
}

需要检查创建/解析控制器所涉及的每个类,以确保它们的依赖关系可以正确解析。

【讨论】:

  • 我更新了 TransactionService 服务类构造函数,但我仍然收到相同的错误消息。
  • @user1263981 需要检查创建控制器所涉及的每个类,以确保它们的依赖关系可以正确解决。比如,存储库实现是否有依赖关系等等。
  • 这导致了 MRepository 类中的错误,我不知道为什么。把这个评论出来之后。它工作正常。公共 MRepository() { _connectionString = ConfigurationManager.ConnectionStrings[WebConnection"].ConnectionString; }
  • 配置文件中很可能缺少WebConnection,这导致在调用.ConnectionString 时出现空错误。
  • 这是有道理的。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-28
  • 1970-01-01
  • 2018-07-27
  • 2016-06-20
  • 2023-04-04
  • 1970-01-01
相关资源
最近更新 更多