2017-03-31 10 views
2

델파이 팩토리를 사용하여 오토 팩의 데코레이터를 사용하려고하는데 매개 변수를 해결할 수없는 것 같습니다.오토 팩 데코레이터 + 델리게이트 팩토리

public interface IFoo 
{ } 

public class Foo : IFoo 
{ 
    public Foo(string bar) 
    { ... } 
} 

public class DecoratedFoo : IFoo 
{ 
    public DecoratedFoo(IFoo decorated) 
    { ... } 
} 
내가 지금 같은 서비스에 주입하고자하는

:

public SomeService(Func<string, IFoo> factory) 
{ 
    // I would expect IFoo to be a DecoratedFoo here 
    IFoo foo = factory("hello"); 
} 

내가 등록한 부품과 같이 :

builder.RegisterType<Foo>() 
    .Named<IFoo>("foo") 
    .UsingConstructor(typeof(string)); 

builder.RegisterDecorator<IFoo>(
    (ctx, inner) => new DecoratedFoo(inner), 
    fromKey: "foo"); 

를 내가 내 매개 변수의 막대를 해결할 수 없다는 오류가 . 이것은 단순한 예제이지만 bar의 값이 무엇인지 알 수 없으므로 (따라서 공장을 사용함).

내가하는 일을 수행 할 방법이 있습니까?

답변

1

RegisterDecorator을 사용하면 Foo 생성자로 전달되는 문자열 매개 변수가 더 이상 공장에 전달되지 않습니다. 그것에 대해 열려있는 issue입니다. (당신이 관찰)이 Foo의 매개 변수가없는 생성자를 찾으려고하고 아무도 없기 때문에 그래서이 라인에

IFoo foo = factory("hello"); 

그것은 예외가 발생합니다.

당신은 제거 할 수 있습니다, 해결하는 방법 RegisterDecorator하고 대신에 수동으로 수행 코드의

builder.RegisterType<Foo>() 
    .Named<IFoo>("foo");    
builder.Register((cnt, parameters) => 
    new DecoratedFoo(cnt.ResolveNamed<IFoo>("foo", parameters))).As<IFoo>(); 

거의 동일한 금액을하지만, 예상대로 수동으로 매개 변수를 전달하기 때문에, 작동합니다.

+0

오픈 이슈를 알려 주셔서 감사합니다. – Dismissile