5

ASP.NET MVC3 용 StructureMap을 구성하는 방법을 생각하고 있습니다. NuGet을 이미 사용하고 있으며 AppmapStart Folder에 StructuremapMVC라는 cs 파일이 생성되어 있음을 확인합니다. 동일한 코드하지만이 Global.asax에에 배치 App_Start 섹션에서 수동으로 기록됩니다 단순화 IT 및주의 사항 ...먼저 NuGet을 통해 StructureMap 및 MVC3을 시도하십시오.

이것은 내가 얻을 왜

public static class IoC 
    { 
     public static IContainer Initialize() 
     { 
      ObjectFactory.Initialize(x => 
         { 
          x.Scan(scan => 
            { 
             scan.TheCallingAssembly(); 
             scan.WithDefaultConventions(); 
             scan.AddAllTypesOf<IController>(); 
            }); 
          x.For<OpcionDB>().Use(() => new DatabaseFactory().Get()); 
         }); 
      return ObjectFactory.Container; 
     } 
    } 

내 질문은 IOC의 클래스에서 내 코드입니다 내 컨트롤러에 IoC를 다음과 같이 주입 할 때 예외 (이 패턴을 사용한다 : Entity Framework 4 CTP 4/CTP 5 Generic Repository Pattern and Unit Testable) :

,451,515,
 private readonly IAsambleaRepository _aRep; 
     private readonly IUnitOfWork _uOw; 

     public AsambleaController(IAsambleaRepository aRep, IUnitOfWork uOw) 
     { 
      _aRep = aRep; 
      this._uOw = uOw; 
     } 

     public ActionResult List(string period) 
     { 
      var rs = _aRep.ByPeriodo(period).ToList<Asamblea>(); 

      return View(); 
     } 

예외가 나타났다 :

Exception Details: System.MissingMethodException: No parameterless constructor defined for this object. 

답변

3

을 당신이를 contruct하는 데 필요한 의존성을 해결하지 않는 설정 StructureMap을 가지고 있기 때문에 AsambleaController 그래서 하나가없는 매개 변수없는 생성자를 찾습니다.

그럼 구조판을 IAsambleaRepositoryIUnitOfWork으로 설정하면됩니다.

참고로, IUnitOfWork은 컨트롤러가 아닌 리포지토리에 종속되어야한다고 말하고 싶습니다. 컨트롤러는 작업 단위에 대해 알 필요가 없습니다.

2

은 당신이 이러한 구성을 추가 할 것 귀하의 IoC.cs 파일 :

x.For<IUnitOfWork>().HttpContextScoped().Use<UnitOfWork>(); 
x.For<IDatabaseFacroey>().HttpContextScoped().Use<DatabaseFactory>(); 
x.For<IAsambleaRepository >().HttpContextScoped().Use<AsambleaRepository>(); 

전화 : scan.TheCallingAssembly(); MVC 프로젝트 만 볼 것입니다. 당신이 당신의 솔루션에 다른 프로젝트에서 서비스 및 저장소가있는 경우는 다음과 같이 추가해야합니다 : 당신은 그 오류를 얻고있다

scan.Assembly("Your.Assembly"); 
1

디버그에서 실행하면 아마도 StructureMap IOC 해결 오류가 발생합니다.

대신 실제 해상도 오류가 발생하는 대신이 메시지가 표시됩니다. 라인을 따라 MVC 파이프 라인이 실제 오류를 삼킨다.

2

NuGet에서 StructureMap.MVC3을 설치하면 SmDependencyResolver.cs라는 파일이 DependencyResolution 폴더에 설치됩니다. 거기에있는 GetService 메소드에는 예외가 발생하면 null을 반환하는 try ... catch가 있음을 알 수 있습니다. 이렇게하면 예외의 세부 정보가 표시되지 않으므로 대신 "매개 변수없는 생성자 없음"에 대한 오류 메시지가 표시됩니다.

원래 예외에 대한 자세한 내용을 보려면 catch 절에 무언가를 추가하여 원래 예외의 세부 정보 (예 : 디버그)를 가져올 수 있습니다.쓰기 라인 여기에 :

public object GetService(Type serviceType) 
    { 
     if (serviceType == null) return null; 
     try 
     { 
      return serviceType.IsAbstract || serviceType.IsInterface 
        ? _container.TryGetInstance(serviceType) 
        : _container.GetInstance(serviceType); 
     } 
     catch (Exception ex) 
     { 
      Debug.WriteLine(ex.ToString()); 
      return null; 
     } 
    } 

이 정보는 문제의 원인을 추적하는 데 도움이 될 수 있습니다.

+0

+1 : 도움이되었습니다. 감사. –

+0

StructMap을 사용하여 수년간이 사실을 전혀 알지 못했지만이 블록을 찢어 버릴 것입니다. 나는 결코 StructureMap을 버블시키지 않기를 바란다고 생각하지 않는다. –

관련 문제