Нужно построить объект запроса на основе типа. Как бы вы это сделали? - PullRequest
0 голосов
/ 13 июля 2011

Я не понимаю, какой шаблон использовать / лучше всего подходит для моих требований. Надеюсь, вы сможете уточнить. Не уверен, использовать ли строителя или фабрику.

Сценарий такой. Создайте объект запроса и передайте его стороннему компоненту, который я не могу контролировать

Запрос может быть разных типов - EmployeeRequest-WorkerRequest-etc ... и каждый запрос будет иметь методы типа "GetXXX" -GetYYY "и т. Д.

Пример Нодди Я сделал следующее:

        class Program
            {
                static void Main()
                {
                    Request employeeRequest = new EmployeeRequest { Id=1,FirstName = "Foo", LastName = "Bar" };

                    Service myservice=new Service();
                    var response = myservice.DoSomething(employeeRequest);

                    //do something with the response ...
                }
            }

            public class Service
            {
                public Response DoSomething(Request request)
                {
                    Factory factory = new Factory();
                    Request myRequest = factory.Create(request);

                    //Call my third party component
                    //Response myResponse = MyThirdPartyComponent.DoSomething(myRequest);
                    //return myResponse;
                    return new Response();
                }
            }

            public class Factory
            {
                public Request Create(Request request)
                {
                    if (request is EmployeeRequest)
                    {
                        EmployeeRequest employeeRequest = new EmployeeRequest();
                        employeeRequest.FirstName = request.FirstName;
                        employeeRequest.LastName = request.LastName;
                        return employeeRequest;
                    }
                    else
                    {
                        WorkerRequest workerRequest = new WorkerRequest();
                        workerRequest.FirstName = request.FirstName;
                        workerRequest.LastName = request.LastName;
                        return workerRequest;
                    }
                }
            }

            public abstract class Request
            {
                public int Id { get; set; }
                public string FirstName { get; set; }
                public string LastName { get; set; }
            }
            public class Response
            {
                public string FirstName { get; set; }
                public string LastName { get; set; }
            }

            public class EmployeeRequest : Request
            {}
            public class WorkerRequest : Request
            {}
            public class EmployeeResponse : Response
            {}
            public class WorkerResponse : Response
            {}

Если бы вы реализовали это, как бы вы это сделали:

Спасибо

Ответы [ 2 ]

0 голосов
/ 13 июля 2011

Если вы просто пытаетесь заполнить свойства базового типа Request для типов, которые наследуют Request, создайте универсальный метод (вам может потребоваться немного изменить вашу модель):

void Main()
{
    var request = new WorkRequest();
    request.FirstName = "joe";
    request.LastName ="smith";

    var employeeRequest = RequestFactory.Create<EmployeeRequest>(request);

    System.Diagnostics.Debug.Assert(employeeRequest.FirstName == request.FirstName);
}

public class RequestFactory
{
    public static T Create<T>(Request request)
        where T : Request, new()
    {
        return (T)Activator.CreateInstance(typeof(T), request);
    }
}

public abstract class Request
{
    protected Request() {}

    protected Request(Request request)
    {
        this.FirstName = request.FirstName;
        this.LastName = request.LastName;
    }

    public string FirstName {get;set;}

    public string LastName {get;set;}
}

public class EmployeeRequest : Request
{
    public EmployeeRequest(){}

    public EmployeeRequest(Request request) 
        : base(request)
    {

    }
}   

public class WorkRequest : Request
{
    public WorkRequest(){}

    public WorkRequest(Request request) 
        : base(request)
    {

    }
}   
0 голосов
/ 13 июля 2011

Лично я бы вместо того, чтобы Factory построить свой запрос, вероятно добавил абстрактный метод Request GetRequest() в Request абстрактный класс и реализовал бы его конкретную реализацию в каждом EmployeeRequest, WorkerRequest, .. ..

Потому что, по сути, по крайней мере, глядя на предоставленный код, вы делаете:

  1. Создать EmployerRequest и присвоить его Request

  2. После передачи его методу Factory для создания is и создания EmployerRequest «клон» для передачи на сервер. Не знаю, действительно ли вам это нужно, но если предположить, что да, то почему бы просто не попросить сам объект создать еще один тип самого ?

Надеюсь, это было ясно, мое мнение.

С уважением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...