2010-11-23 43 views
1

我正在使用ASP.NET MVCNinject,我試圖創建一個ActionResult工廠。比方說,我有以下ActionResults如何創建一個返回具有不同參數的不同實例的工廠?

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

所以每個ActionResult,參數的參數類型和數量會有所不同。我創建了一個ActionResultFactory看起來像這樣:

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

我怎麼會寫這個工廠,以便它可以帶參數,並將其傳遞給對象的構造?或者我應該做這樣的代替:

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"; 

其中每個屬性被公開曝光和我對象創建後,將它們分配?

+0

你的參數在哪裏?你的意思是`T`? – 2010-11-23 03:41:32

回答

1

創建3創建方法爲每個類型,傳遞所需的參數,並創建實例這樣的。

public FailResult CreateFailResult(int failcode) 
{ 
    return _kernel.Get<FailResult>(new ConstructorArgument("failCode", failcode)); 
} 
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

哦,似乎我誤解了OP的問題。哦,我可憐的英語! – 2010-11-23 03:58:53

+0

@Danny Chen中文? – 2010-11-23 05:24:08

1

您需要帶參數的構造函數注入。

請參閱以下鏈接

Ninject with parameters

+0

Ninject 2似乎沒有`With.Parameters`。 – 2010-11-23 05:13:44

相關問題