2010-11-23 5 views
1

Ich verwende ASP.NET MVC mit Ninject und ich versuche, eine ActionResult Fabrik zu erstellen. Sagen wir, ich habe folgendes ActionResults:Wie erstelle ich eine Fabrik, die verschiedene Instanzen mit unterschiedlichen Parametern zurückgibt?

public class SuccessResult : ActionResult 
{ 
    public string SuccessMessage { get; set; } 

    public SuccessResult(string successMessage) { ... } 
} 

public class FailResult : ActionResult 
{ 
    public int FailCode { get; set; } 

    public FailResult(int failCode) { ... } 
} 

public class DataResult : ActionResult 
{ 
    public object Data { get; set; } 
    public string MimeType { get; set; } 

    public DataResult(object dataToSerialize, string mimeType) { ... } 
} 

Also für jeden ActionResult, die Parametertypen und die Anzahl der Parameter unterschiedlich sein wird. Ich habe ein ActionResultFactory die wie folgt aussieht:

public class ActionResultFactory 
{ 
    private readonly IKernel _kernel; 

    public ActionResultFactory(IKernel kernel) 
    { 
     _kernel = kernel; 
    } 

    public T Create<T>() where T : ActionResult 
    { 
     return _kernel.Get<T>(); // how do I pass the parameters? 
    } 
} 

Wie würde ich das Werk zu schreiben, so dass es Parameter nehmen und sie an den Konstruktor des Objekts übergeben? Oder sollte ich es stattdessen tun:

wo jede Eigenschaft öffentlich verfügbar ist und ich sie nach der Objekterstellung zuweisen?

+0

Wo ist dein Parameter? Meinst du "T"? –

Antwort

1

3 erstellen erstellen Methoden für jede Art, die erforderlichen Argumente übergeben und die Instanz wie folgt erstellen.

public FailResult CreateFailResult(int failcode) 
{ 
    return _kernel.Get<FailResult>(new ConstructorArgument("failCode", failcode)); 
} 
+1

kein großer Fan dieser Lösung, aber ich sehe keinen anderen Weg, es zu tun. –

0
public T Create<T>(params object[] parameters) 
{ 
    T instance = _kernel.Get<T>(); 
    if (typeof(T) == typeof(FailResult)) 
    { 
     FailResult result = (FailResult)instance; 
     result.ErrorCode = (int)parameters[0]; 
     return result; 
    } 
} 
+0

Oh, es scheint, dass ich die Frage von OP falsch verstanden habe. Oh mein armes Englisch! –

+0

@Danny Chen Chinesisch? –

1

Sie benötigen eine Konstruktoreinspritzung mit Parametern.

Bitte siehe unten Link

Ninject with parameters

+0

Ninject 2 scheint nicht 'With.Parameters' zu haben. –

Verwandte Themen