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.
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