0

Я борюсь с этой проблемой инъекции зависимости, используя untiy. Я осуществил согласно этой ссылке https://www.asp.net/web-api/overview/advanced/dependency-injectionУдостоверьтесь, что контроллер имеет безкоммертный публичный конструктор в веб-api?

Но получил эту ошибку:

{ 
 
    "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 } 
     ); 
    } 
} 

Невозможно определить, где проблема? Можете, пожалуйста, войти в код и сообщить мне. я следовал всем этим ниже ссылки

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

Но ни один из них не решить мою проблему.

+0

Проблема заключается в том, что приложение не может разрешить зависимость для параметров конструктора, можете ли вы проверить, что .dll внедренного класса присутствует в папке bin веб-API? –

+0

Да, в этом проблема. –

+0

Да, это –

ответ

2

Как я использую MVC и WebAPI в одном проекте, я понял, используя этот link, что мне нужно решить обе зависимости.

Итак, я извлекал ниже код в WebAPIConfig.cs файл

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

После того, как я установил один пакет под названием Unity.WebAPI в моем проекте.

Добавлен ниже код в файл UnityConfig.cs

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

Вот именно, решить мою проблему!

+0

Unity.WebAPI Nuget компонент решил мою проблему .. Спасибо – vinay