2015-02-17 10 views
0

Рассмотрите форму, используя дополнительные параметры для разрешенных компонентов, которые «работают». Обратите внимание, что это okay, если корень разрешен здесь.Как применить сервис переопределять неявно (встроенный, при разрешении) в Castle Windsor?

var c1a = container.Resolve<IC1>(new { v = "a" }); 
var c1b = container.Resolve<IC1>(new { v = "b" }); 
// Takes two different objects, of the same interface 
var root = container.Resolve<C2>(new { c1a = c1a, c2a = c2a }); 

Однако мне не нравится это, потому что 1. ни c1a не c2a будет «автоматически освобожден» и 2. он чувствует себя слишком по эксплуатации.

container.Release(c2); 
container.Release(c1a); 
container.Release(c1b); 

То, что я хотел бы сделать что-то вроде следующего (который является недействительным, конечно), который использует неявное службы переопределения - обратите внимание, что есть только один прямой Resolve и объекты должны быть созданы ХО внутренне.

var root = container.Resolve<C2>(new { 
    c1a = InlineOverride.For<IC1>.With(new { v = "a" }), 
    c2a = InlineOverride.For<IC1>.With(new { v = "a" }) 
}); 
container.Release(root); // Just one root 

У меня есть чувство, я просто отсутствует понятие/применение Service Overrides, которые, как представляется, поддерживается только явно при регистрации зависимого компонента (С2).

ответ

0

так только один способ, которым я справился с чем-то близким к этому, не уверен, что это поможет.

public class Tinker 
{ 
    public interface ISomethingWithChar 
    { 
     char V { get; set; } 
    } 

    public class SomethingWithChar:ISomethingWithChar 
    { 
     public char V { get; set; } 
    } 

    public interface INeedTwoSomethingWithChars 
    { 
     ISomethingWithChar C1A { get; set; } 
     ISomethingWithChar C2A { get; set; } 
    } 

    public class NeedTwoSomethingWithChars:INeedTwoSomethingWithChars 
    { 
     public ISomethingWithChar C1A { get; set; } 
     public ISomethingWithChar C2A { get; set; } 
    } 

    public class Installers:IWindsorInstaller 
    { 
     public void Install(IWindsorContainer container, IConfigurationStore store) 
     { 
      container.Register(
      Component 
       .For<ISomethingWithChar>() 
       .ImplementedBy<SomethingWithChar>() 
       .Named("CharOne") 
       .DynamicParameters((k,d) => 
       { 
        d["V"] = container.Resolve<IArgs>().CharOne; 
       }), 
      Component 
       .For<ISomethingWithChar>() 
       .ImplementedBy<SomethingWithChar>() 
       .Named("CharTwo") 
       .DynamicParameters((k, d) => 
       { 
        d["V"] = container.Resolve<IArgs>().CharTwo; 
       }), 
      Component 
       .For<INeedTwoSomethingWithChars>() 
       .ImplementedBy<NeedTwoSomethingWithChars>() 
       .DependsOn(Parameter.ForKey("C1A").Eq("${CharOne}"), Parameter.ForKey("C2A").Eq("${CharTwo}"))); 
     } 
    } 


    public static void DoSomething(IArgs args) 
    { 
     using (var container = BootstrapContainer(args)) 
     { 
      var needTwo = container.Resolve<INeedTwoSomethingWithChars>(); 
      Console.WriteLine("One: {0} and Two: {1}", needTwo.C1A.V, needTwo.C2A.V); 
     } 
    } 

    private static IWindsorContainer BootstrapContainer(IArgs args) 
    { 
     var container = new WindsorContainer(); 
     container.Register(Component 
      .For<IArgs>() 
      .Instance(args)); 

     container.Install(FromAssembly.This()); 

     return container; 
    } 
}