2017-07-25 2 views
0

I eine Klasse mit Faltenbalg Konstruktor:Windsor registrieren Singleton-Komponente und lösen durch Konstruktorparameter vorbei

Foo(FooType type) 

die FooType ist ein Enum. Ich registrieren diese Klasse wie folgt aus:

container.Register(
    Component.For<IFoo>() 
      .ImplementedBy<Foo>() 
      .LifestyleSingleton()) 

ich zwei Instanzen dieser Klasse mit Differenz FooType haben müssen. Ich nehme ich vor, diese Art wie unten:

IFoo foo1 = container.Resolve<IFoo>(new { type = FooType.Type1 }); 
IFoo foo2 = container.Resolve<IFoo>(new { type = FooType.Type2 }); 

Ist foo1 und foo2 gleiche Objekte?

Antwort ist Ja, Also, wie kann ich Foo als Singleton registrieren und zwei Instanz es mit der Differenz FooType lösen?

+0

Sie können nicht zwei Singleton Instanzen der gleichen Klasse haben ... – meJustAndrew

+0

@Fred in Erwägung ziehen, Ihre eigene Lösung in einer Antwort zu veröffentlichen, damit andere sie einfacher finden können und dieser Thread wird geschlossen. – Iqon

+0

@Iqon OK, ich habe meine Lösung als Antwort veröffentlicht. – Fred

Antwort

1

ich mit meinem Problem endlich gelöst durch IFoo-IFoo<T> Umwandlung und mehrere Schnittstelle statt Enum-Werte. Nun ist mein Code wie folgt:

public interface IFooType 
{ } 

public interface IFooType1 : IFooType 
{ } 

public interface IFooType2 : IFooType 
{ } 

public interface IFoo<T> 
    where T : IFooType 
{ 
    string FooType { get; } 
} 

public class Foo<T> : IFoo<T> 
    where T : IFooType 
{ 
    public string FooType 
    { 
     get 
     { 
      return typeof(T).ToString(); 
     } 
    } 
} 

Und registrieren und lösen Foo:

container.Register(Component.For(typeof(IFoo<>)) 
          .ImplementedBy(typeof(Foo<>)) 
          .LifestyleSingleton()); 

var foo1 = container.Resolve<IFoo<IFooType1>>(); 
var foo2 = container.Resolve<IFoo<IFooType2>>(); 

Console.WriteLine("foo1 : " + foo1.FooType); // return foo1: IFooType1 
Console.WriteLine("foo2 : " + foo2.FooType); // return foo1: IFooType2 

Auf diese Weise gelöst mein Problem, aber ich bin nicht sicher, ob es der einzige Weg, dies zu tun?

0

Sie können dies nicht direkt tun. Der Singleton Lifestyle bedeutet, dass es nur eine Instanz Ihres Services gibt, das ist Singleton.

Um mehrere Instanzen zu erhalten, können Sie entweder den Lebensstil auf transient ändern (oder möglicherweise beschränkt) oder diesen Dienst mehrmals registrieren. Dazu benötigen Sie eine Möglichkeit, jede Serviceinstanz eindeutig zu adressieren.

In Windsor ist es möglich, Namen Dienste zu registrieren.

container.Register(
    Component.For<IFoo>().ImplementedBy<Foo>().LifestyleSingleton().Named("Instance1), 
    Component.For<IFoo>().ImplementedBy<Foo>().LifestyleSingleton().Named("Instance2) 
); 

Sie können dann diese Art lösen durch den Aufruf:

var intsance1 = container.Resolve("Instance1"); 
var intsance2 = container.Resolve("Instance2"); 

Aber weil Ihre Dienste Singletons sind, ist es nicht möglich, den Konstruktor Parameter in jedem Beschluss zu übergeben, wird sie nur einmal verwendet werden. In diesem Fall wäre es wahrscheinlich besser, die Konstruktorparameter beim Registrieren der Dienste einzustellen. Sie können dies tun, indem DepensOn(...)

container.Register(
    Component.For<IFoo>() 
      .ImplementedBy<Foo>() 
      .LifestyleSingleton() 
      .Named("Instance1) 
      .DependsOn(new { type = FooType.Type1 }), 
    Component.For<IFoo>() 
      .ImplementedBy<Foo>() 
      .LifestyleSingleton() 
      .Named("Instance2) 
      .DependsOn(new { type = FooType.Type2 }) 
); 
+1

Ich löste mein Problem schließlich, indem ich IFoo in IFoo umwandelte und meinen Code wie oben ändere. – Fred

+0

das wird auch funktionieren;) – Iqon

Verwandte Themen