Make sure that the controller has a parameterless

2019-06-01 19:03发布

I am struggling with this problem of dependency injection using untiy. I have implemented according to this link https://www.asp.net/web-api/overview/advanced/dependency-injection

But got this error:

{
  "Message": "An error has occurred.",
  "ExceptionMessage": "An error occurred when trying to create a controller of type 'WebAPIController'. Make sure that the controller has a parameterless public constructor.",
  "ExceptionType": "System.InvalidOperationException",
  "StackTrace": "   at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)\r\n   at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request)\r\n   at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()",
  "InnerException": {
    "Message": "An error has occurred.",
    "ExceptionMessage": "Type 'Fairmoves.Controllers.WebAPIController' does not have a default constructor",
    "ExceptionType": "System.ArgumentException",
    "StackTrace": "   at System.Linq.Expressions.Expression.New(Type type)\r\n   at System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType)\r\n   at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator)\r\n   at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"
  }
}

My Web Api Controller:

[RoutePrefix("api/WebAPI")]
public class WebAPIController : ApiController
{
    private readonly IUserBusinessService UserBusinessService;
    private readonly ILoginBusinessService LoginBusinessService;

    //public WebAPIController():base()
    //{
    //}

    public WebAPIController(IUserBusinessService UserBusinessService, ILoginBusinessService LoginBusinessService)
    {
        this.UserBusinessService = UserBusinessService;
        this.LoginBusinessService = LoginBusinessService;
    }
    [HttpPost]
    public IHttpActionResult Login([FromBody]AuthModels.LoginModel model)
    {
        // string strUserId = credentials.LoginName;
        //string strPassword = credentials.Password;
        var serviceResultDAO1 =  LoginBusinessService.LoginUserSubmit(model.LoginName);
    }
}

UnityResolver.cs:

public class UnityResolver:IDependencyResolver
{
    protected IUnityContainer container;

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

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

    [DebuggerStepThrough]
    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();
    }

}

}

WebApiConfig.cs:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        //config.DependencyResolver = new NinjectResolver();

        var container = new UnityContainer();
        container.RegisterType<ILoginBusinessService, LoginBusinessService>(new HierarchicalLifetimeManager());
        container.RegisterType<IUserBusinessService, UserBusinessService>(new HierarchicalLifetimeManager());
        config.DependencyResolver = new UnityResolver(container);
        //DependencyResolver.SetResolver(new UnityDependencyResolver(container));

        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

Unable to identify where the problem is? Can please get into the code and let me know. I have followed all these below links

Make sure that the controller has a parameterless public constructor?

Autofac - Make sure that the controller has a parameterless public constructor

Make sure that the controller has a parameterless public constructor using Ninject

Make sure that the controller has a parameterless public constructor error

But none of these solved my problem.

2条回答
太酷不给撩
2楼-- · 2019-06-01 19:39

I guess you were merging WebAPI into MVC which was tightly coupled, that now decoupling by adding a Dependency injection hence I am doing same as @Edukondalu thaviti said above, in addition to that changing little code that worked for me perfectly.

  1. Install Unity.WebAPI and Unity.WebApi.5.1 using Manage Nuget Packages

    Note:After completion of installation dialog box will open and ask you to overwrite Unity.Config.cs file, simply select No

  2. Make sure to exist UnityConfig.RegisterComponents(); inside Application_Start() method at Global.asax.cs file

  3. Now include

    container.RegisterType<IWebAPIBusinessService, WebAPIBusinessService>(); container.RegisterType<IWebAPIDomainService, WebAPIDomainService>(); container.RegisterType<IWebAPIDataService, WebAPIDataService>(); GlobalConfiguration.Configuration.DependencyResolver = new Unity.WebApi.UnityDependencyResolver(container); inside the method RegisterComponents() at Unity.Config.cs file. Assuming that you were already created instance for current class.

Now run your project. The above code worked for me perfectly, If you cross over any mistakes please correct me.

查看更多
放我归山
3楼-- · 2019-06-01 19:57

As i am using both MVC and WebAPI in one project, i understood by using this link that i need to resolve both dependencies.

So, i removed below code in WebAPIConfig.cs file

var container = new UnityContainer();
    container.RegisterType<ILoginBusinessService, LoginBusinessService>(new HierarchicalLifetimeManager());
    container.RegisterType<IUserBusinessService, UserBusinessService>(new HierarchicalLifetimeManager());
    config.DependencyResolver = new UnityResolver(container);

After i installed one package called Unity.WebAPI in my project.

Added below code in UnityConfig.cs file

GlobalConfiguration.Configuration.DependencyResolver = new Unity.WebApi.UnityDependencyResolver(container);

That's it, solved my problem!

查看更多
登录 后发表回答