2011-05-09 3 views
4

그래서 나는 매끄러운 줄 알았는데. 컨텍스트 주위를 매번 새롭게하지 않고 매핑 (Entity 프레임 워크)을 정의 할 수 있어야합니다.이 작업을 수행하려면 DbContext 클래스를 상속해야합니다. 나는 그것을 던지기 위해 내가 던져 넣는 어떤 문맥으로도 계속 연결하고 싶습니다. 나는 거기에 평소 용의자와 (법인) 소요 IRepository 인터페이스 및 IContextFactory에 대한 종속성과 그것의 구현 ...StructureMap 2.6.1, IRepository <T> 및 EFRepository <T,TContext>

public interface IContextFactory<T> where T : DbContext 
{ 
    T Context { get; } 
} 

그리고 내 "EFRepository"

public class EFRepository<T, TContext> : IRepository<T> where T : class 
     where TContext : DbContext 
{ 

    public EFRepository(IContextFactory<TContext> contextFactory) 
    { 
    } 
} 
에있어

내 매핑에서 나는이 작업 중 하나를했습니다 ...

 x.For(typeof(IContextFactory<>)).Use(typeof(ContextFactory<>)); 
     x.For(typeof(IRepository<>)).Use(typeof(EFRepository<,>)); 

Ok cool. 내 단위 테스트, 난 ...

 var repository = ObjectFactory.GetInstance<EFRepository<Currency, EFContext>>(); 
     var repository2 = ObjectFactory.GetInstance<IRepository<Currency>>(); 

먼저 하나가 작동 문제 이런 식으로하려고하지. 두 번째 하나, 나는 타격을받습니다

제공되는 일반 인수의 수가 일반 형식 정의의 수와 동일하지 않습니다. 매개 변수 이름 : 인스턴스화

2를 통과 한 이후로 IRepository에 전달할 일반화 된 구조 맵을 말하지 않기 때문에 그럴 것 같습니다. 어떻게해야합니까? ... 할 수 있을까요?

답변

3

이것은 가능해야하지만 실제로는 더러워요. 누군가가 더 좋은 방법을 안다면.

먼저 EFRepository<,>을 만드는 방법을 변경해야합니다. .Use(context => ...) 오버로드를 사용하면 context.BuildStack.Current.RequestedType.GetGenericArguments()과 같은 컨텍스트에 액세스하여 액세스하려는 제네릭 형식을 얻을 수 있습니다. 그런 다음 반사를 사용하고 IContextFactory을 컨텍스트에서 가져 오는 EFRepository<,>의 새 인스턴스를 새로 만들 수 있습니다.

그래서 관계없이,

  ObjectFactory.Configure(x => 
      { 
       x.For(typeof(IContextFactory<>)).Use(typeof(ContextFactory<>)); 
       x.For(typeof (IRepository<>)).Use(context => 
        { 
         Type arg1 = context.BuildStack.Current.RequestedType. 
          GetGenericArguments()[0]; 

         Type targetType = 
          typeof (EfRepository<,>).MakeGenericType(new[] {arg1, typeof (IContextFactory<>)}); 

         return Activator.CreateInstance(targetType, 
                 new[] {context.GetInstance(typeof (IContextFactory<>))}); 

        }); 
       //x.For(typeof(IRepository<>)).Use(typeof(EfRepository<,>)); 
      }); 

     var repository = ObjectFactory.GetInstance<EfRepository<Currency, EfContext>>(); 
     var repository2 = ObjectFactory.GetInstance<IRepository<Currency>>(); 

같은 뭔가가 당신에게 대부분의 방법을 얻을 것이다. 난 아직도 제대로 작동하기 전에 targetType의 두 번째 일반 매개 변수에 대한 제네릭을 적절하게 설정해야한다고 생각합니다.

+0

그래서 진짜 대답은 "이건 다른 방식으로하는 짓이야"... 나는 그걸로 끝이야! 지금 당장 질문을 열어 두겠습니다.하지만 이것이 올바른 대답 일 수 있습니다. 그리고 당신 말이 맞아요. :-( – jeriley