Как мне создать фабрику, которая возвращает разные экземпляры с разными параметрами? - PullRequest
1 голос
/ 23 ноября 2010

Я использую ASP.NET MVC с Ninject и пытаюсь создать фабрику 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";

где каждое свойство публикуется публично, и я назначаю его после создания объекта?

Ответы [ 4 ]

1 голос
/ 23 ноября 2010

Создать 3 Создайте методы по одному для каждого типа, передайте необходимые аргументы и создайте экземпляр следующим образом.

public FailResult CreateFailResult(int failcode)
{
    return _kernel.Get<FailResult>(new ConstructorArgument("failCode", failcode));
}
1 голос
/ 23 ноября 2010

Вам необходим инжектор конструктора с параметрами.

См. Ссылку ниже

Ninject с параметрами

0 голосов
/ 23 ноября 2010

Вы можете создать небольшого провайдера для нового и инициализации объектов ActionResult для вас. Объясняется здесь:

См. Создание экземпляра с использованием Ninject с дополнительными параметрами в конструкторе

0 голосов
/ 23 ноября 2010
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;
    }
}
...