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
감사합니다,하지만 시험의 몇 가지는 필요하기에, 사촌을 추가하는 생성자의 이름과 방법을 정확히 동일해야 만들어야합니다 다른 상황 - 실패 할 것입니다. –
잘 모르겠습니다 만 전달 된 매개 변수와 결과 객체의 이름을 비교하여 팩토리를 테스트하거나 성 테스트 자체에 의지 할 수 있습니다 (https://github.com). /castleproject/Windsor/tree/master/src/Castle.Windsor.Tests/Facilities/TypedFactory – samy
ctor u에 문자열 someName을 입력하면 빌드 u에 "someName"이 아닌 "name"또는 " param1 ". 나는 시험했다. 그건 내 실수 였어. 많은 도움을 준 작업 예제에 대해 많은 감사를드립니다. –