2012-08-26 3 views
2

내가 structuremap 부트 스트 래퍼 여기 https://github.com/NancyFx/Nancy.Bootstrappers.StructureMapstructuremap는 낸시 부트 스트 래퍼

와 스트랩 nancyfx를 부팅을 시도하고 내 설정이다 :

StructureMap Exception Code: 202 
No Default Instance defined for PluginFamily Infrastructure.IRepository, Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 
+0

'IRepository'에 대한 참조를 어디에서 얻으려고하십니까? NancyFX에서는 ObjectFactory.GetInstance ()을 사용할 필요가 거의 없습니다. 'IRepository'를 사용하고있는 코드/콜 스택 샘플로 업데이트 하시겠습니까? (가능하다면 NancyModule로 시작) – codeprogression

답변

1
: 나는 var repo = ObjectFactory.GetInstance<IRepository>();를 사용하는 경우

 protected override void ConfigureApplicationContainer(IContainer container) 
    { 

     container.Configure(x => 
     { 
      x.ForSingletonOf<IRazorConfiguration>() 
       .Use<DefaultRazorConfiguration>(); 

      x.ForSingletonOf<ISessionContainer>().Use<SessionContainer>(); 

      x.For<IRepository>().LifecycleIs(new HttpContextLifecycle()).Use<Repository>(); 

      x.Scan(scanner=> 
      { 
       scanner.TheCallingAssembly(); 
       scanner.AddAllTypesOf<IRepository>(); 

      }); 
     }); 
     base.ConfigureApplicationContainer(container); 
    } 

public interface IRepository 
{ 
    void Save(); 
} 

    public class Repository:IRepository 
{ 

    ISessionContainer _session; 
    public Repository(ISessionContainer container) 
    { 
     _session = container; 
    } 

    public void Save() 
    { 

    } 
} 

,이 예외가

제안 된 답변에 어떤 일이 일어 났는지 확실하지 않지만이 문제를 해결 한 방법은 다음과 같습니다.

protected override void ConfigureApplicationContainer(IContainer container) 
{ 
    container.Configure(x => 
    { 
     x.ForSingletonOf<IRazorConfiguration>() 
      .Use<DefaultRazorConfiguration>(); 
     x.ForSingletonOf<ISessionContainer>().Use<SessionContainer>();//Duplicate 
     x.Scan(scanner=> 
     { 
      scanner.TheCallingAssembly(); 
      scanner.AddAllTypesOf<IRepository>(); 
     }); 
    }); 
    ObjectFactory.Configure(x => 
    { 
     x.ForSingletonOf<ISessionContainer>().Use<SessionContainer>();//Duplicate 
     x.For<IRepository>().Use<Repository>(); 
    }); 
    base.ConfigureApplicationContainer(container); 
} 

해킹이지만이 방법으로 작동시킬 수있는 유일한 방법입니다.

6

해킹을 없애고 싶습니다. 문제의 원인은 ObjectFactory를 사용하는 방법입니다. 정말로 NancyModule 내부의 "GetInstance"에 ObjectFactory를 사용해서는 안됩니다. 대신, 저장소가 필요한 NancyModule의 생성자에 IRepository를 포함해야합니다. 그런 다음, Structuremap (부트 스트 래퍼를 사용하여 Nancy 프레임 워크에 연결됨)은 구체화 된 저장소를 인스턴스화 할 때 모듈에 간단하게 삽입합니다. 여기에 NancyModule의 예 : 여기

public class ProductModule : NancyModule { 

    private IRepository _repository; 

    public ProductModule(IRepository repository) { 

     _repository = repository; 

     SetupRoutes(); 
    } 

    private void SetupRoutes() { 
     Get["/product/{id}"] = p => { 
      return _repository.Get<Product>((int)p.id); 
     };   
    } 
} 

이 모듈이 REPO를 얻기 위해 IOC에게 호출되지는 ... 그것은 이미 있어요. 부트 스트 래퍼가이를 가능하게합니다. 이제 ObjectFactory의 해킹 된 구성을 제거 할 수 있습니다.

일반적인 조언으로 "ObjectFactory"를 사용하여 유형을 확인하면 자신을 때리고 타이핑을 중지해야합니다. 대신, 위와 같이 생성자 삽입을 사용하여 종속성을 주입해야합니다.

관련 문제