0

저는 Entity Framework DbContext Typed 기본 클래스를 사용하는 리포지토리 프로젝트 내에 몇 개의 리포지토리 클래스가 있습니다.Castle Windsor가 기본 클래스를 만들거나 노출하지 않습니다.

기본 클래스

public class RepositoryBase<TC> : IDisposable 
    where TC : DbContext, new() 
{ 

    public virtual T Get<T>(...) where T : class 
    { 
     ... 
    } 

    // ... additional code 
} 

직원 리포 인터페이스

namespace Insight.Repository.Interfaces 
{ 
    public interface IEmployeeRepository 
    { 
     Result CreateEmployee(Employee employee); 
     // ... additional code 
    } 
} 

직원 리포는

namespace Insight.Repository.Repositories 
{ 
    public class EmployeeRepository : RepositoryBase<InsightContext>, IEmployeeRepository 
    { 
     public Result CreateEmployee(Employee employee) 
     { 
      return Save(employee); 
     } 
    } 
    // ... additional code 
} 

나는를 사용하여 Asp.Mvc 웹 사이트 내에서 윈저 컨테이너에 리포 클래스를 추가하고 리포지토리 프로젝트 내의 인터페이스를 기반으로하는 설치 프로그램입니다. 이 시점에서 컨테이너를 살펴 봤는데 세 곳의 저장소가 있습니다.

public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     container.Register(Classes.FromAssemblyNamed("Insight.Repository") 
      .Where(Component.IsInNamespace("Insight.Repository.Repositories")) 
      .WithService.DefaultInterfaces() 
      .LifestyleTransient()); 
    } 

다음과 같이 DbContext를 등록하려고했지만 동일한 결과가 나타납니다.

container.Register(Component.For<DbContext>() 
      .ImplementedBy<InsightContext>() 
      .LifestyleTransient()); 

그런 다음 내 ApiController 내에서, 나는 다음 리포 클래스의 인스턴스를 속성 주입을 사용하고 있지만 기본 클래스의 기능에 액세스 얻을 수 없습니다.

public class EmployeeController : ApiController 
{ 
    public IEmployeeRepository EmployeeRepo { get; set; } 

    [Route("GetEmployee")] 
    public void Get() 
    { 
     var newEmployeeRepo = new EmployeeRepository(); 
    } 
} 

EmployeeRepo는 기본 클래스에서 가져 오기() 함수에 액세스 할 수 없습니다하지만 newEmployeeRepo는 않습니다.

이것은 Castle.Windsor를 사용하는 첫 번째 프로젝트이며 명확하게 등록 단계가 빠져 있지만 알아낼 수 있습니다.

누군가가 올바른 방향으로 나를 가리킬 수 있다면, 많이 감사하겠습니다.

편집 :이 라인에 tym32167

void Main() 
{ 
    var container = new WindsorContainer(); 

    var type = typeof(II); 
    container.Register(Classes.FromAssembly(type.Assembly) 
     .Where(Component.IsInNamespace(type.Namespace)) 
     .WithService.AllInterfaces() 
     .LifestyleTransient()); 

    var cls = container.Resolve<II>().Dump(); 
    cls.GetFirstName().Dump(); 
    cls.GetLastName().Dump(); 
} 

public interface II 
{ 
    string GetFirstName(); 
} 

public class MyClass : II 
{ 
    public string GetFirstName() 
    { 
    return "First Name"; 
    } 

    public string GetLastName() 
    { 
    return "Last Name"; 
    } 
} 

코드 나누기에서 제공하는 Linqpad 코드 테스트 :

cls.GetLastName().Dump(); 

하면이 예상 된 행동인가?

답변

0

것은, 당신이 필요로하는 기본 클래스에 메소드에 접근하기

.WithService.DefaultInterfaces() 

.WithService.AllInterfaces() 

교체 기본 인터페이스를 가짐 :

public interface IBaseRepo<T> 
{ 
    T Get(int id); 
    // ... 
} 

public interface IEmployeeRepo : IBaseRepo<Employee> 
{ 
    Employee GetByFirstName(string name); 
    // ... 
} 

하위 인터페이스가 기본 인터페이스를 상속하는 방식에 유의하십시오. 따라서 IEmployeeRepo을 구현하는 모든 유형은 IBaseRepo<Employee>을 구현하며, 하나를 삽입하면 기본 인터페이스의 메소드에도 액세스 할 수 있습니다.

구체적인 직원 레포가 상속하는 기본 클래스에서 기본 저장소를 구현한다는 사실은 클라이언트 코드가 신경 쓸 필요가없는 구현 세부 사항입니다. 지금은 그렇지 않습니다.

+0

글쎄, 만약 당신이 그것을 넣으면, 그것은 아주 분명하게 들린다. 감사합니다.이 솔루션은 매력적이었습니다. – Vazmo

0

시도 (단지 linqpad로 확인) 샘플

void Main() 
{ 
    var container = new WindsorContainer(); 

    var type = typeof(II); 
    container.Register(Classes.FromAssembly(type.Assembly) 
      .Where(Component.IsInNamespace(type.Namespace)) 
      .WithService.AllInterfaces() 
      .LifestyleTransient()); 

    container.Resolve<II>().Dump(); 
} 

public interface II 
{ 
} 

public class MyCl : II 
{ 
} 
+0

변경 사항을 제안했지만 RepositoryBase 클래스에서 추가 IDisposable 인터페이스를 선택하는 것처럼 보였습니다. 등록 후 컨테이너를 살펴보면 컨테이너 구성 요소 내에 ** EmployeeRepository/IEmployeeRepository = Transient **가 ** EmployeeRepository/IEmployeeRepository 및 기타 1 개의 서비스 = Transient **로 변경되었으며 추가 ** IDisposable ** 항목이 있습니다. 컨테이너의 서비스 내. 아직 기본 클래스 기능이 해결되지 않았습니다. – Vazmo

+0

당신은 webapi를 사용하고 있습니까? dependencyresolver/dependency scope와 같은 모든 nececarry 관련 항목을 구현하고 있습니까? castle windsor로 기본 샘플을 만들었 으면 https://github.com/tym32167/webapisample (특히 global.asax.cs 및 Core 폴더는 https://github.com/tym32167/webapisample/tree/master/)에서 확인하십시오. src/Sample/Core) – tym32167

+0

그런데 생성자 주입은 속성 주입보다 훨씬 낫습니다. 왜냐하면 한 곳에서 모든 의존성을 볼 수 있기 때문입니다. - ctor arguments, 2. - 해결에 문제가 있으면 메시지와 함께 런타임 예외가 발생하고 스택 추적 – tym32167