代码之家  ›  专栏  ›  技术社区  ›  JMon

Api控制器出现无参数公共构造函数错误

  •  4
  • JMon  · 技术社区  · 9 年前

    我正在使用Unity进行DI,我遇到了以下错误:-

    “尝试创建类型为“UploadController”的控制器时出错。请确保该控制器具有无参数的公共构造函数。”

    我有以下UnityResolver:-

    public class UnityResolver : IDependencyResolver, IDependencyScope, System.Web.Http.Dependencies.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();
        }
    }
    

    }

    我创建了一个UnityConfig,如下所示:-

    public static class UnityConfig
    {
        public static void RegisterComponents()
        {
            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>();
    
            BuildUnityContainer();
            GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);
        }
    
        private static IUnityContainer BuildUnityContainer()
        {
            var container = new UnityContainer();
    
            // register all your components with the container here
            // you don't need to register controllers
            container.RegisterType<IFileHelpers, FileHelpers>();
            container.RegisterType<IDatabaseHelper, DatabaseHelper>();
            container.RegisterType<IPlayersHelpers, PlayersHelpers>();
            container.RegisterType<IBaseRepository, BaseRepository>();
            container.RegisterType<IAttribsRepository, AttribsRepository>();
            container.RegisterType<IPlayerRepository, PlayerRepository>();
            container.RegisterType<IFileRepository, FileRepository>();
            container.RegisterType<IPlayerAttribsRepository, PlayerAttribsRepository>();
    
            container.RegisterType<FMContext>();
            container.RegisterType<UserManager<ApplicationUser>>(new HierarchicalLifetimeManager());
            container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(new HierarchicalLifetimeManager());
    
            return container;
        }
    }
    

    }

    我正在初始化WebApiConfig.cs中的所有内容

        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services
            // Configure Web API to use only bearer token authentication.
            config.SuppressDefaultHostAuthentication();
            config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
    
            // Web API configuration and services
            var container = new UnityContainer();
            UnityConfig.RegisterComponents();
            config.DependencyResolver = new UnityResolver(container);
    
            config.EnableCors();
    
            // Web API routes
            config.MapHttpAttributeRoutes();
    
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
    }
    

    这是我的UploadController类:-

        public class UploadController : ApiController
    {
        private readonly IFileHelpers _fileHelpers;
        private readonly IDatabaseHelper _databaseHelper;
        private readonly IPlayersHelpers _playersHelpers;
    
        public UploadController(IFileHelpers fileHelpers, IDatabaseHelper databaseHelper, IPlayersHelpers playersHelpers)
        {
            _fileHelpers = fileHelpers;
            _databaseHelper = databaseHelper;
            _playersHelpers = playersHelpers;
        }
    
        public async Task<HttpResponseMessage> Post()
        {........................}
    

    你能帮我确定我做错了什么吗。我需要申报其他东西才能使它生效吗?

    谢谢你的帮助和时间

    1 回复  |  直到 9 年前
        1
  •  5
  •   Rob Davis    9 年前

    在Register方法中,您有以下代码:

    // ...
    // Web API configuration and services
    var container = new UnityContainer();
    UnityConfig.RegisterComponents();
    config.DependencyResolver = new UnityResolver(container);