웹 API 2 프로젝트에서 Autofac 설정을 가져 오려고합니다. 나는 그걸 두어 번 전에 사용했다. 나는 Nuget를 모두 사용하여 Autofac과 Autofac.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>();
}
내가 말할 수있는 것부터 모든 것이 셋업되어 있습니다. 바르게. 내가 잊어 버린 것을 찾아 낼 수 있습니까?
OWIN을 사용하십니까? 또한,'ConfigureInversionOfControl'을 호출하는 코드를 보여주십시오. –
Visual Studio에 코드를 추가하면 제대로 작동하지 않을 수도 있습니다. 언급 한 예외는 컨테이너에 등록되지 않은 종속성을 사용하려고 할 때 일반적으로 발생합니다.또한 예외의 'InnerException' 속성은 의존성이없는 정보를 보유해야합니다 – tdragon
전체 예외 세부 정보를 표시하십시오 : 예외의 메시지, 유형 및 스택 추적 및 ** 모든 ** 내부 예외. – Steven