我的界面如下:
public interface IRequest
{
Guid RequestUId { get; set; }
TicketSystemTypeEnum TicketSystemType { get; set; }
}
由以下类的Request,DeskPro,ServiceNow实现:
public class Request : IRequest
{
public Guid RequestUId { get; set; }
public Guid RequestId { get; set; }
public Guid RequestResourceId { get; set; }
public string RequestCreator { get; set; }
public DateTime CreatedDate { get; set; }
public List<Task> Tasks { get; set; }
public TicketSystemTypeEnum TicketSystemType { get; set; }
public StatusEnum Status { get; set; }
}
public class DeskPro : IRequest
{
public Guid RequestUId { get; set; }
public Guid TicketId { get; set; }
public Guid EmployeeId { get; set; }
public DateTime DateCreated { get; set; }
public List<Task> Tasks { get; set; }
public TicketSystemTypeEnum TicketSystemType { get; set; }
public StatusEnum TicketStatus { get; set; }
}
public class ServiceNow : IRequest
{
public Guid RequestUId { get; set; }
public Guid TicketNumber { get; set; }
public Guid EmployeeNumber { get; set; }
public DateTime CreatedOn { get; set; }
public List<Task> Tasks { get; set; }
public TicketSystemTypeEnum TicketSystemType { get; set; }
public StatusEnum TicketPosition { get; set; }
}
现在,来自请求对象的数据必须以它们各自的格式发送到DeskPro和ServiceNow。为此,正在使用映射器。同样,要获取相应的票证系统,请使用工厂方法。
private IRequest mappedData;
public IRequest GetMappedData(Request request)
{
IRequest requestedProduct = RequestFactory.CreateRequestFactory(request.TicketSystemType);
requestedProduct.RequestUId = request.RequestUId;
***requestedProduct.TicketId = request.RequestId;
requestedProduct.EmployeeId = request.RequestResourceId;
requestedProduct.DateCreated = request.CreatedDate;
requestedProduct.TicketStatus = request.Status;***
requestedProduct.TicketSystemType = request.TicketSystemType;
return mappedData;
}
public abstract class RequestFactory
{
public static IRequest CreateRequestFactory(TicketSystemTypeEnum ticketSystemTypeEnum)
{
switch(ticketSystemTypeEnum)
{
case TicketSystemTypeEnum.DeskPro:
return new DeskPro();
case TicketSystemTypeEnum.ServiceNow:
return new ServiceNow();
default:
return null;
}
}
}
但是,在三个***之间,映射器方法GetMappedData()出现错误。这再次很明显,因为我们的IRequest没有所有这些字段。那么我们如何解决这个问题-根据我的对象类型,可以实例化该对象。另外,如果需要避免梯子。
您可以使用is
keyword然后强制转换类型,但这需要is
的链非常丑陋
为了更好地利用代码中的多态性。...
我建议这个:
定义另一个界面if-else
或IRequestMapped
,它应该大致如下:
IMapped<T>
然后您的类定义如下:
public interface IMapped<T>
{
void LoadFrom(T otherType);
}
如果您需要重用映射器类,则可以创建界面:
public class DeskPro : IRequest, IMapped<Request>
{
public Guid RequestUId { get; set; }
public Guid TicketId { get; set; }
public Guid EmployeeId { get; set; }
public DateTime DateCreated { get; set; }
public List<Task> Tasks { get; set; }
public TicketSystemTypeEnum TicketSystemType { get; set; }
public StatusEnum TicketStatus { get; set; }
public void LoadFrom(Request r)
{
//MAP FROM REQUEST
}
}
public class ServiceNow : IRequest, IMapped<Request>
{
public Guid RequestUId { get; set; }
public Guid TicketNumber { get; set; }
public Guid EmployeeNumber { get; set; }
public DateTime CreatedOn { get; set; }
public List<Task> Tasks { get; set; }
public TicketSystemTypeEnum TicketSystemType { get; set; }
public StatusEnum TicketPosition { get; set; }
public void LoadFrom(Request r)
{
//MAP FROM REQUEST
}
}