2010-11-23 49 views
1

J'utilise ASP.NET MVC avec Ninject et j'essaye de créer une usine ActionResult. Disons que je donne les résultats suivants ActionResults:Comment créer une fabrique qui renvoie des instances différentes avec des paramètres différents?

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) { ... } 
} 

Ainsi, pour chaque ActionResult, les types de paramètres et le nombre de paramètres seront différents. J'ai créé un ActionResultFactory qui ressemble à ceci:

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? 
    } 
} 

Comment pourrais-je écrire l'usine afin qu'elle puisse prendre des paramètres et de les transmettre au constructeur de l'objet? Ou devrais-je le faire à la place:

var result = factory.Create<SuccessResult>(); 
result.SuccessMessage = "Success!"; 

var result = factory.Create<FailResult>(); 
result.FailCode = 404; 

var result = factory.Create<DataResult>(); 
result.Data = file; 
result.MimeType = "text/plain"; 

où chaque propriété est exposée publiquement et je les assigne après la création de l'objet?

+0

Où est votre paramètre? Voulez-vous dire «T»? –

Répondre

1

Créer 3 Créer des méthodes un pour chaque type, passer les arguments nécessaires et de créer l'instance comme celui-ci.

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

Pas un grand fan de cette solution, mais je ne vois pas d'autre moyen de le faire. –

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, il semble que j'ai mal compris la question de OP. Oh mon pauvre anglais! –

+0

@Danny Chen Chinois? –

1

Vous avez besoin d'une injection constructeur avec des paramètres.

S'il vous plaît voir lien ci-dessous

Ninject with parameters

+0

Ninject 2 ne semble pas avoir 'With.Parameters'. –