2017-10-31 22 views
1

은 내가 수정할 수 없습니다 외부 서비스를 DbContext,하지만 난 단지 그 기능의 범위에 새 클래스 라이브러리를 추가 할 수 있습니다. 내 문제는 클래스 라이브러리가 EF-> Repository-> Service 및 IOC 컨테이너를 사용하며 라이브러리에 외부 서비스를 연결하면이 서비스에는 연결 문자열이 정의되어 있지 않으므로 작동하지 않는다는 것입니다. 나는 사용자 서비스 로케이터 할 수있는 내 클래스 라이브러리에서 IOC 컨테이너를 구현하고 정의하는 것을 발견 :를 주입 연결 문자열은

나는 생성자에 연결 문자열을 전달하는 내 자신의 부분 클래스를 만들었
internal class ServiceLocator 
{ 
    static ServiceLocator() 
    { 
     Current = new DefaultServiceLocator(); 
    } 

    public static IServiceLocator Current { get; } 

    private sealed class DefaultServiceLocator : IServiceLocator 
    { 
     private readonly IKernel _kernel; // Ninject kernel 

     public DefaultServiceLocator() 
     { 
      _kernel = new StandardKernel(); 
      LoadBindings(); 
     } 

     public T Get<T>() 
     { 
      return _kernel.Get<T>(); 
     } 

     private void LoadBindings() 
     { 

      string name = ""; // connection string 
      _kernel.Bind<DbContext>().ToConstructor(_ => new Entities(name)); 
      _kernel.Bind<IRegionService>().To<RegionService>(); 
      _kernel.Bind<IRegionRepository>().To<RegionRepository>(); 
      _kernel.Bind<IMapper>().ToConstant(AutoMapperConfig.Initialize()); 
     } 
    } 
} 

:

public partial class Entities 
{ 
    public Entities(string name) 
     :base(name) 
    { 
    } 
} 

자동 생성으로 클래스는 연결 문자열을 전달하는 것을 허용하지 않습니다 (그리고 나는 이것을 수정하지 않음) :

public partial class Entities : DbContext 
{ 
    public Entities() 
    : base("name=Entities") 
    { 
    } 
} 

나는 그것이 자동 생성 DbContext을 의미 볼 내가 디버그 모드에서 내 테스트 응용 프로그램을 실행 대신에 클래스를 만들어야합니다. 앞서 말했듯이 App.config 파일에 연결 문자열을 추가하기 위해 외부 서비스를 수정할 수 없습니다. 친절하게 제 문제에 대한 가능한 모든 해결책을 제공하십시오. 나는 변화를 디자인하도록 개방적이다.

+0

내가 이것을 이해하지 않는다 : "나는 디버그 모드에서 내 테스트 응용 프로그램을 실행할 때 나는 대신에 의해 생성에 자동 생성 DbContext 클래스에 참조하는 참조 나를." 다른 클래스의 부분 클래스를 추가 할 때, 여전히 동일한 클래스이지만 더 많은 파일에 정의되어있을 수 있으므로 결국 솔루션에 하나의 클래스 만 있어야합니다. 또는 다른 네임 스페이스 또는 어셈블리에서 부분 클래스를 만들었습니까? ("이름 = 엔티티") 기본 : 기본 (이름)이 아닌 공공 기관() : –

+0

@JanMuncinsky는 내 클래스 라이브러리는 공공 기관 (캐릭터 이름)을 인스턴스화 것이다 완. 두 번째 경우 테스트 응용 프로그램은 App.config 파일에서 Entities 연결 문자열을 검색하려고 시도합니다. 내가하고 싶은 일은 내 클래스 라이브러리의 연결 문자열을 하드 코딩하고 엔티티 (문자열 이름) : base (이름)를 호출하는 것입니다. 내가 성취하고자하는 것을 설명합니까? – ironcurtain

답변

1

이 수업의 일부를 대신 DbContextEntities 의존성을 기대 보인다. 이 경우 Ninject는 암시 적 자체 바인딩에 대체하는 경향이 있으며 해결할 수있는 종속성을 가진 생성자를 선택합니다 (이 경우 기본값).

대신이 바인딩을 시도

_kernel.Bind<Entities>().ToConstructor(_ => new Entities(name));

+1

감사합니다. 그게 내 문제를 해결해 줬어. – ironcurtain