구조지도 매개 변수없는 생성자 오류
-
21-12-2019 - |
문제
웹 API 2를 사용하여 구조지도 ver 3.0.5.0을 설정하려고합니다.
그러나 My ComplexController에 대한 얻을 때이 오류가 발생합니다.
유형 'productController'유형의 컨트롤러를 만들려고 할 때 오류가 발생했습니다.컨트롤러에 매개 변수없는 공용 생성자가 있는지 확인하십시오.
누구든지 My StudyureMap Config가 잘못된 것을 볼 수 있습니까?CREATE 메서드가 호출되지 않습니다.
public class StructureMapControllerActivator : IHttpControllerActivator
{
private readonly IContainer _container;
public StructureMapControllerActivator(IContainer container)
{
if (container == null) throw new ArgumentNullException("container");
_container = container;
}
public IHttpController Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
{
try
{
var scopedContainer = _container.GetNestedContainer();
scopedContainer.Inject(typeof(HttpRequestMessage), request);
request.RegisterForDispose(scopedContainer);
return (IHttpController)scopedContainer.GetInstance(controllerType);
}
catch (Exception e)
{
// TODO : Logging
throw e;
}
}
}
.
public void InitializeContainer()
{
// STRUCTURE MAP
Container container = new Container();
GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerActivator), new StructureMapControllerActivator(container));
container.Configure(x => x.For<IForumRepository>().Use<ForumRepository>());
container.Configure(x => x.For<IComplexRepository>().Use<ComplexRepository>());
}
.
public class ComplexesController : ApiController
{
private IComplexRepository _repo;
public ComplexesController(IComplexRepository repo)
{
_repo = repo;
}
// GET: api/Complexes
public IList<Complex> GetComplexes()
{
var complexes = _repo.GetList();
return complexes;
}
...
.
[assembly: OwinStartup(typeof(AngularJSAuthentication.API.Startup))]
namespace AngularJSAuthentication.API
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
HttpConfiguration config = new HttpConfiguration();
WebApiConfig.Register(config);
app.UseWebApi(config);
}
}
}
. 해결책
여기서는 Service Activator가 HttpConfiguration 객체가 아닌 GlobalConfiguration 개체로 서비스 활성화자를 등록하고있는 것입니다.이 시나리오에서는 HttpConfiguration 객체로 대체 된 것으로 GlobalConfiguration 객체가 사용되지 않습니다.문제를 해결하기 위해 InitialIzeContainer () 메서드를 다음과 같이 바꾸어야합니다.
public void InitializeContainer(HttpConfiguration config)
{
// STRUCTURE MAP
Container container = new Container();
config.Services.Replace(typeof(IHttpControllerActivator), new StructureMapControllerActivator(container));
container.Configure(x => x.For<IForumRepository>().Use<ForumRepository>());
container.Configure(x => x.For<IComplexRepository>().Use<ComplexRepository>());
}
.
HTTPConfiguration 객체를 시작 클래스에서 새 InitialIzeContainer () 메서드로 전달해야합니다.
희망이 도움이됩니다.
-b
다른 팁
나는 완전한 수명주기에 대한 견고한 이해를 얻으려고 노력하고 있습니다.나는 설치가 위와 약간 다를 수 있다고 생각합니다.여기서 나에게 일했던 것입니다.
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
var config = new HttpConfiguration();
var container = IocConfig.Setup();
// Allow a controller to be declared without a parameterless constructor
config.DependencyResolver = new DependencyResolver(container);
config.Services.Add( typeof(IExceptionLogger), new GlobalExceptionLogger( container.GetInstance<ILoggingService>()));
// Web API routes
config.MapHttpAttributeRoutes();
// Setup Authentication
ConfigureOAuth(app, container);
var corsOptions = CorsOptions.AllowAll;
app.UseCors(corsOptions);
// Add ASP.Net Web API to OWIN pipeline
app.UseWebApi(config);
}
}
.
이 라인을 추가 한 후에 일했습니다.
// Allow a controller to be declared without a parameterless constructor
config.DependencyResolver = new DependencyResolver(container);
.
정적 설정 방법으로 iocconfig라는 정적 클래스에서 My VAR 컨테이너로드를 가져와야합니다.이것은 인터페이스가 콘크리트 구현에 매핑되는 곳입니다.
또한 전체 예제를 사용하려면 GlobalExceptionLogger 줄을 무시할 수 있습니다.