2017-01-16 1 views
2

웹 API 2 프로젝트에서 Autofac 설정을 가져 오려고합니다. 나는 그걸 두어 번 전에 사용했다. 나는 Nuget를 모두 사용하여 AutofacAutofac.WebApi2을 설치했습니다.웹 API가있는 Autofac 2 - 매개 변수가없는 생성자 오류

public partial class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 

     // Get our http configuration 
     var config = new HttpConfiguration(); 

     // Register the Autofac middleware FIRST. This also adds 
     // Autofac-injected middleware registered with the container. 
     var container = ConfigureInversionOfControl(app, config); 

     // Register all areas 
     AreaRegistration.RegisterAllAreas(); 
     GlobalConfiguration.Configure(WebApiConfig.Register); 

     // Use our web api 
     app.UseWebApi(config); 
    } 

    /// <summary> 
    /// Configures Autofac DI/IoC 
    /// </summary> 
    /// <param name="app"></param> 
    /// <param name="config"></param> 
    private IContainer ConfigureInversionOfControl(IAppBuilder app, HttpConfiguration config) 
    { 

     // Create our container 
     var builder = new ContainerBuilder(); 

     // You can register controllers all at once using assembly scanning... 
     builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); 

     // Register our module 
     builder.RegisterModule(new AutofacModule()); 

     // Build 
     var container = builder.Build(); 

     // Lets Web API know it should locate services using the AutofacWebApiDependencyResolver 
     config.DependencyResolver = new AutofacWebApiDependencyResolver(container); 

     // Return our container 
     return container; 
    } 
} 

이 같은 외모 만든 모듈 : 그런 다음 내 시작 수업 시간에 내가 이런 짓을

public class AutofacModule : Module 
{ 
    protected override void Load(ContainerBuilder builder) 
    { 

     // Create our Singletons 
     builder.RegisterType<DatabaseContext>().As<DbContext>().InstancePerRequest(); 

     // Create our Services 
     builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePerRequest(); 
     builder.RegisterType<AnswerService>().As<IAnswerService>().InstancePerRequest(); 
     builder.RegisterType<CategoryService>().As<ICategoryService>().InstancePerRequest(); 
     builder.RegisterType<FeedService>().As<IFeedService>().InstancePerRequest(); 
     builder.RegisterType<FilterService>().As<IFilterService>().InstancePerRequest(); 
     builder.RegisterType<QuestionGroupService>().As<IQuestionGroupService>().InstancePerRequest(); 
     builder.RegisterType<StateService>().As<IStateService>().InstancePerRequest(); 

     // Create our providers 
     //builder.RegisterType<AnswerProvider>().As<IAnswerProvider>().InstancePerLifetimeScope(); 
     builder.RegisterType<CategoryProvider>().As<ICategoryProvider>().InstancePerRequest(); 
     builder.RegisterType<FeedProvider>().As<IFeedProvider>().InstancePerRequest(); 
     builder.RegisterType<FilterProvider>().As<IFilterProvider>().InstancePerRequest(); 
     builder.RegisterType<QuestionGroupProvider>().As<IQuestionGroupProvider>().InstancePerRequest(); 
     builder.RegisterType<StateProvider>().As<IStateProvider>().InstancePerRequest(); 
    } 
} 

을 그리고 나는 이런 내 API 생성자의 매개 변수로 공급자를 추가 :

// Readonly properties 
private readonly ICategoryProvider _provider; 

/// <summary> 
/// Default constructor 
/// </summary> 
public CategoriesController(ICategoryProvider provider) 
{ 
    _provider = provider; 
} 

하지만 (우체부 사용) API를 호출하려고하면이 오류가 발생합니다.

{ 
    "message": "An error has occurred.", 
    "exceptionMessage": "An error occurred when trying to create a controller of type 'CategoriesController'. 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 'Piiick.Api.Controllers.CategoriesController' 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)" 
    } 
} 

저는 이제 막혀 있는데 문제가 어디 있는지 전혀 알 수 없습니다. 카테고리 제공자는 이런 생성자 가지고

/// <summary> 
/// Default constructor 
/// </summary> 
public CategoryProvider(IUnitOfWork unitOfWork, ICategoryService service) 
{ 

    // Map our properties 
    _unitOfWork = unitOfWork; 
    _service = service; 
} 

CategoryService을 가지고 이런 생성자 :

/// <summary> 
/// The default constructor 
/// </summary> 
/// <param name="unitOfWork"></param> 
public CategoryService(IUnitOfWork unitOfWork) 
    : base(unitOfWork) 
{ 
} 

및 마지막 의 UnitOfWork 이런 생성자를 가지고

/// <summary> 
/// Default constructor 
/// </summary> 
/// <param name="context">The database context</param> 
public UnitOfWork(DbContext context) 
{ 
    _context = context; 
    _repositories = new Dictionary<Type, object>(); 
} 

내가 말할 수있는 것부터 모든 것이 셋업되어 있습니다. 바르게. 내가 잊어 버린 것을 찾아 낼 수 있습니까?

+0

OWIN을 사용하십니까? 또한,'ConfigureInversionOfControl'을 호출하는 코드를 보여주십시오. –

+0

Visual Studio에 코드를 추가하면 제대로 작동하지 않을 수도 있습니다. 언급 한 예외는 컨테이너에 등록되지 않은 종속성을 사용하려고 할 때 일반적으로 발생합니다.또한 예외의 'InnerException' 속성은 의존성이없는 정보를 보유해야합니다 – tdragon

+0

전체 예외 세부 정보를 표시하십시오 : 예외의 메시지, 유형 및 스택 추적 및 ** 모든 ** 내부 예외. – Steven

답변

3

내가 문제를 발견했습니다. HttpConfiguration을 사용하여 종속성 해결 프로그램을 설정했는데여야합니다.. 내가에서 내 라인을 변경하는 경우

그래서 :

config.DependencyResolver = new AutofacWebApiDependencyResolver(container); 

GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container); 

에 모든 작업을 시작했다.

0

당신의 용기 구축하기 전에 응용 프로그램 도메인의 실행 컨텍스트에로드 된 어셈블리를 등록하십시오 :

var assemblies = AppDomain.CurrentDomain.GetAssemblies(); builder.RegisterAssemblyModules(assemblies);

/// <summary> 
/// Configures Autofac DI/IoC 
/// </summary> 
/// <param name="app"></param> 
/// <param name="config"></param> 
private IContainer ConfigureInversionOfControl(IAppBuilder app, HttpConfiguration config) 
{ 

    // Create our container 
    var builder = new ContainerBuilder(); 

    // You can register controllers all at once using assembly scanning... 
    builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); 

    // Register our module 
    builder.RegisterModule(new AutofacModule()); 

    // [!!!] ** Register assemblies of the current domain ** 
    var assemblies = AppDomain.CurrentDomain.GetAssemblies(); 
    builder.RegisterAssemblyModules(assemblies); 

    // Build 
    var container = builder.Build(); 

    // Lets Web API know it should locate services using the AutofacWebApiDependencyResolver 
    config.DependencyResolver = new AutofacWebApiDependencyResolver(container); 

    // Return our container 
    return container; 
} 

을 그리고 정의하는 것을 잊지 마세요 :

public class AutofacModule : Module 
{ 
    protected override void Load(ContainerBuilder builder) 
    { 

     ... 

     builder.RegisterControllers(typeof(WebApiApplication).Assembly); 
     builder.RegisterApiControllers(typeof(WebApiApplication).Assembly); 
    } 
} 
+0

RegisterController 메소드는 MVC만을위한 것이다. – r3plica

관련 문제