2

안녕하세요 다시 stackoverflowians,Castle Windsor로 일반 유형 및 서비스 등록 IoC

DI 프레임 워크를 사용하는 방법을 배웠던 시간이라고 생각했습니다. 캐슬 윈저에 관해 많은 좋은 것을 들었습니다. 그렇게하기로 마음 먹었습니다. 이제는 그것을 사용하는 방법에 대한 튜토리얼이 많이 있습니다. 그러나 Generics가 참여할 때해야 할 일에 대한 많은 유용한 정보를 찾을 수 없습니다. 여기에 내 문제가있다.

나는이 상황에서 제네릭에 BaseDAO

namespace Utilities.DataAccess 
{ 
    public class BaseDAO<T> : IBaseDAO<T> 
    { 
     public BaseDAO(IConnectionProvider _connectionProvider) 
     { 
      // Stuff 
     } 
    } 
} 

임 조금 새로운 가지고 있고이없는 일반 선언과는 제네릭 구현 단순히 인터페이스와 'BaseDAO'이 일부 자습서를 보았다 그 위에. 나는 이전의 많은 프로젝트 (IoC없이)에서 위의 방법을 사용했고 App.config 이후로 나에게 잘 돌아갔다. 어쨌든,!

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    <section 
     name="castle" 
     type="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler, Castle.Windsor"></section> 
    </configSections> 

    <castle> 
    <components> 

     <component 
     id="BaseDAO" 
     service="Utilities.DataAccess.Interfaces.IBaseDAO`1, Utilities.DataAccess" 
     type="Utilities.DataAccess.BaseDAO`1, Utilities.DataAccess" /> 

     <component 
     id="NHibernateConnection" 
     service="Utilities.DataAccess.ConnectionProviders.IConnectionProvider, Finchtils" 
     type="Utilities.DataAccess.ConnectionProviders.NHibernateConnection" /> 

     <component 
     id="XMLConnection" 
     service="Utilities.DataAccess.ConnectionProviders.IConnectionProvider, Finchtils" 
     type="Utilities.DataAccess.ConnectionProviders.XMLConnection, Utilities" /> 
    </components> 
    </castle> 
</configuration> 

이제 여러분 중 일부는 지금 생각할 수있는 것처럼 이것이 유틸리티 라이브러리입니다. 필자는 모든 프로젝트에서 동일하게 유지되는 동일한 데이터 액세스 코드를 작성할 필요가 없도록 내가 만든 각 프로젝트에이 어셈블리를 사용할 계획입니다. 그러한 과정의 함축적 의미는 성 (Class)을 BaseDAO에 전달할 유형 매개 변수를 정확하게 말할 수 없다는 것입니다. 한 프로젝트에서 Customer 객체가 될 수도 있고 또 다른 완전히 다른 것일 수도 있습니다. 다른 포럼에서 컨테이너에서 객체를 요청할 때 유형을 지정할 수있는 것처럼 전적으로 가능하다고 읽었습니다. 내 디자인의 노력에 대해이지만

BaseDAO<Customer> baseDao = container.Resolve<BaseDAO<Customer>>(); 

, 나는 다음과 같은 내가 얻을 어떤 경우에도,이 중 근무하지 않은,

<component 
    id="BaseDAO" 
    service="Utilities.DataAccess.Interfaces.IBaseDAO`1[[Utilities.DataInterface.IEntity]], Finchtills.DataAccess" 
    type="Utilities.DataAccess.BaseDAO`1[[Utilities.DataInterface.IEntity]], Finchtils.DataAccess" /> 

그러나의 App.config에 다음과 같은 표기법을 사용하는 것을 시도했다 오류 :

Utilities.Testing.DataAccess.Unit.Testing_BaseDAO (TestFixtureSetUp): 
System.Exception : The type name Utilities.DataAccess.BaseDAO`1, Utilities.DataAccess could not be located. 
    ----> System.IO.FileNotFoundException : Could not load file or assembly 'Utilities.DataAccess' or one of its dependencies. The system cannot find the file specified. 

이 오류를 읽고, 내 생각 그것은 두 가지 중 하나 일 수

,536,
  1. 유형 및 서비스의 일반 사항과 관련하여 구성 파일에서 뭔가를 놓치고 있습니다.

  2. 나는 어셈블리 이름을 잘못 명명했다.

내가 어떤 시점에서 내가 <solution name>.<project name>.<item folder>.<item name>을 사용했지만 단순히 프로젝트 레벨에서 시작 항목 즉,에 포함되어 프로젝트와 어셈블리 이름을 처리했다 ... 나는 그 모든 설정 옵션을 것이라고 가정 그것으로부터 어떤 해결책이 불려지는지 아십시오.

이 문제에 대해 도움을 주실 수있는 분들께 감사드립니다.

+1

왜 코드 대신 XML을 사용하고 있습니까? http://stw.castleproject.org/Windsor.Three-Calls-Pattern.ashx –

+0

"코드 외부에서이 구성을 만들므로보다 융통성이 있으며 응용 프로그램을 다시 컴파일하지 않고도 변경할 수 있습니다." - 캐슬 윈저에서 시작 가이드를 추천. – user407356

+0

는 그리고 그 링크를 클릭 한 후 게시 나는 것을 볼 수 : 실제로 구성 코드 어쨌든 정의 된 어셈블리의 App.config에서 호출 반환 새로운 WindsorContainer() .Install (Configuration.FromAppConfig(), FromAssembly.This() .이 사이트는 또한 xml을 통해 구성 요소를 등록 할 것을 제안한다고 가정합니다. – user407356

답변

1

어셈블리 이름하여 비주얼 스튜디오에서 찾을 수 있습니다 솔루션 탐색기에서

  • , 속성 노드
  • 를 열고 응용 프로그램 탭을 두 번 클릭
  • 어셈블리 이름은 오른쪽 상단 근처

또는 명령 줄에서 컴파일하는 경우 /out 인수를 사용합니다.

또한 대괄호 안의 유형 인수에 대한 어셈블리를 지정해야합니다. 그래서, 가정의 모든 유형은 DATAACCESS 어셈블리, 그리고 어셈블리는 "DATAACCESS"(간결함을 위하여)라는 것을 :

<component 
    id="BaseDAO" 
    service="Utilities.DataAccess.Interfaces.IBaseDAO`1[[Utilities.DataInterface.IEntity, DataAccess]], DataAccess" 
    type="Utilities.DataAccess.BaseDAO`1[[Utilities.DataInterface.IEntity, DataAccess]], DataAccess" /> 

그러나 나는 그것이 코드에서 등록을하는 것이 좋습니다 것을 다른 댓글에 동의합니다. verbose 타입의 구문을 사용할 필요는 없으며 타입에 대한 컴파일러 검사를 받게됩니다. 그러나 몇 가지 단점이 있습니다. 등록 호출이 유형을 사용하는 것으로 계산되므로 사용하지 않는 유형이 있는지 여부를 알기가 더 어렵습니다.

+0

샘플 코드를 보내 주셔서 감사합니다. – VIJAY