2014-07-04 2 views
2

클래스를 갖는성 윈저 고급 공장 등록

public class SomeClass{ 
    public SomeClass(IBlabla bla, string name){ 
     //.... 
    } 
} 

내가 공장 작성할 수 있습니다

public class SomeClassFactory{ 
public SomeClassFactory(IBlabla bla){ 
     //.... 
    } 
    public SomeClass Create(string name){return new SomeClass(_bla, name)} 
} 

를 그리고 그것과 함께 살고 있습니다. 하지만 궁금합니다 .AsFactory()가 작동하는 것과 같은 방식으로 명백한 팩토리 구현없이이 작업을 수행 할 수있는 솔루션이 있습니까? 추가 매개 변수가 있습니까?

답변

2

Castle에서 typed factories을 통해 구현하지 않아도 가능합니다.

public interface IFactory 
{ 
    T Build<T>(string named); 
} 

어떤 구현을위한 필요가 없습니다, 당신은

있습니다

public interface IBlabla 
{ 
} 

public class Blabla : IBlabla 
{ 
} 

public class SomeClass 
{ 
    public string Name { get; set; } 
    public IBlabla Blabla { get; set; } 
    public SomeClass(IBlabla bla, string named) 
    { 
     Blabla = bla; 
     Name = named; 
    } 
} 

당신이 자신의 생성자에 string named을 가진 요소에 대한 일반적인 공장을 만들 수 있습니다

당신의 기본 클래스를 감안할 때 : 다음은 어떻게 캐슬에 의해 백업 된 공장의 자동 구현을 만드는 도구를 사용하려고합니다.

// container 
var container = new Castle.Windsor.WindsorContainer(); 
// factory facility, needed to add behavior 
container.AddFacility<TypedFactoryFacility>(); 
// let's register what we need 
container.Register(
     // your factory interface 
     Component.For<IFactory>().AsFactory(), 
     // your IBlabla 
     Component.For<IBlabla>().ImplementedBy<Blabla>(), 
     // component, you could register against an interface 
     Component.For<SomeClass>().ImplementedBy<SomeClass>() 
    ); 
// shazam, let's build our SomeClass 
var result = container.Resolve<IFactory>().Build<SomeClass>("bla?"); 

왜 작동합니까? 입력 된 팩토리를 통과 할 때, 캐슬은 팩토리 콜에 전달 된 모든 매개 변수를 해결하는 객체를 시도하고 처리합니다. 따라서 named 매개 변수는 SomeClass의 생성자에 주어집니다. IBlabla은 캐슬에 대한 표준 동작을 통해 해결됩니다. 이

어떤 구현하지 않고 공장 단정이다 : 그것은 매우 도움이되었다, D

+0

감사합니다,하지만 시험의 몇 가지는 필요하기에, 사촌을 추가하는 생성자의 이름과 방법을 정확히 동일해야 만들어야합니다 다른 상황 - 실패 할 것입니다. –

+0

잘 모르겠습니다 만 전달 된 매개 변수와 결과 객체의 이름을 비교하여 팩토리를 테스트하거나 성 테스트 자체에 의지 할 수 있습니다 (https://github.com). /castleproject/Windsor/tree/master/src/Castle.Windsor.Tests/Facilities/TypedFactory – samy

+0

ctor u에 문자열 someName을 입력하면 빌드 u에 "someName"이 아닌 "name"또는 " param1 ". 나는 시험했다. 그건 내 실수 였어. 많은 도움을 준 작업 예제에 대해 많은 감사를드립니다. –