2012-04-02 8 views
2

ich die Ninject Werkserweiterung verwenden und einen benutzerdefinierten Instanz Anbieter Erstellen erklärt im Wiki:Ninject Fabrik Benutzerdefinierte Instance Provider

class UseFirstArgumentAsNameInstanceProvider : StandardInstanceProvider 
{ 
    protected override string GetName(System.Reflection.MethodInfo methodInfo, object[] arguments) 
    { 
     return (string)arguments[0]; 
    } 

    protected override Parameters.ConstructorArgument[] GetConstructorArguments(System.Reflection.MethodInfo methodInfo, object[] arguments) 
    { 
     return base.GetConstructorArguments(methodInfo, arguments).Skip(1).ToArray(); 
    } 
} 

ich die folgende Fabrik Schnittstelle definiert haben:

interface IFooFactory 
{ 
    IFoo NewFoo(string template); 
} 

Ich habe die folgenden Bindungen erstellt:

kernel.Bind<IFooFactory>().ToFactory(() => new UseFirstArgumentAsNameInstanceProvider()); 
kernel.Bind<IFoo>().To<FooBar>().Named("Foo"); 

Jetzt, wenn ich das folgende nenne, bekomme ich eine Instanz von FooBar:

var foobar = fooFactory.NewFoo("Foo"); 

Das alles funktioniert super. Was ich möchte jedoch ist etwas mehr wie folgt aus:

interface IFooTemplateRepository 
{ 
    Template GetTemplate(string template); 
} 

ich ein Repository, das eine Vorlage auf den Namen („Foo“) auf der Basis zurückbringen wird, und ich möchte die Vorlage als Konstruktor Argument übergeben .

public class FooBar 
{ 
    public FooBar(Template template) 
    { 
    } 
} 

Ist das möglich? Ich bin nicht sicher, was die Abhängigkeit von ITemplateRepository haben sollte.

Antwort

1

Verwenden Sie den IoC-Container nicht zum Erstellen von Instanzen von Entitäten. Dies ist eine Geschäftslogik und gehört daher nicht in den Kompositionswurzel. Der richtige Weg, dies zu handhaben, besteht darin, den ORM direkt zu verwenden (z. B. mit dem Repository-Muster, das Sie verwenden).

var template = this.templateRepository.Get("SomeTemplate"); 
var fooBar = this.fooBarFactory.CreateFooBar(template); 
+0

Ich dachte, ich überhitzte es. Ich könnte wahrscheinlich einen benutzerdefinierten Provider erstellen, der den ersten Parameter in eine Vorlage konvertiert und eine Eigenschaft darauf prüft, um festzustellen, welche benannte Instanz erstellt werden soll. – Dismissile

Verwandte Themen