简体   繁体   中英

How to implement growing object with a design pattern?

I want to design a response and design it by responses in my asp.net core application. The simlpe response is like following.

public class Response {
    public string Status { get; set; } => "Ok";
    public BaseReport BaseReport { get;set;}
}

if user sends extra parameters to my service, I want to change my response content dynamically.

public class ReportsController : ControllerBase
{
    [HttpGet]
    public ActionResult<Response> GetReport(bool isEmployee, bool isFinanace, bool isInformatinTech)
    {
        // if all parameters fals, return base report.
        var report = baseReposrService.Get();
        var response = new Response() { BaseReport = report };
        
        if(isEmployee)
        {
            var ereport = employeeService.Get();
            var response = new Response() { 
                BaseReport = report,
                EmployeeReport = ereport
            };
        }
        if(isFinanace)
        {
            var freport = financeService.Get();
            var response = new Response() { 
                BaseReport = report,
                EmployeeReport = freport
            };
        }
        
        ...
        ...
    }
}

the response object is growing by query parameters.

So, is implementing the decorator pattern for this problem right way? Is there any best practice for these type problems?

I tried as below:

public class Response
    {
        public Response()
        {
            BaseReport = new BaseReport();
        }
        public string Status { get; set; } ="Ok";
        public BaseReport BaseReport { get; set; }
    }
    public class BaseReport
    {
        public string report { get; set; }
        public string reportcontent { get; set; }
    }



    public interface IResponseFactory
    {
        IResponseFactory Add(string key);
        Response Create(string key);
    }
    public class ResponseFactory1 : IResponseFactory
    {
        
        private readonly Dictionary<string, Response> _responsedic = new Dictionary<string, Response>();
        public ResponseFactory1()
        {
            
            this.Add("Employee").Add("Finanace").Add("InformatinTech");
        }
        public IResponseFactory Add(string key)
        {
            
            var response = new Response();
            response.BaseReport.report = key;
            response.BaseReport.reportcontent = key + "content";
            _responsedic.Add(key, response);
            return this;
        }
        public Response Create(string responsename)
        {
            if (_responsedic.ContainsKey(responsename))
            {
                return _responsedic[responsename];
            }
            else
            {
                return new Response() { BaseReport = new BaseReport() { report = "basereport",reportcontent= "basereportcontent" } };
            }
        }

in startup class:

services.AddSingleton<IResponseFactory, ResponseFactory1>();

in controller:

[HttpGet]
            public ActionResult<Response> GetReport(string responsetype)
            {
                var response = _responseFactory.Create(responsetype);
                return response;
             }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM