在下面的代码中,我意识到将它们命名为“Sender”可能是错误的,并且Send
方法最好移动到另一个类。
真正发生的是从多个来源创建单一类型的对象,每个来源包含一些常见输入(在基础发件人中处理)和更具体的输入(在派生发件人中处理)。
假设我将Send
方法移到辅助类中,我应该将这些类重命名为什么?
abstract class LoanEventSenderBase<T> where T : LoanEvent, new()
{
protected readonly T LoanEvent;
protected string Topic;
protected LoanEventSenderBase(ILoans loans)
{
LoanEvent = new T
{
LoanNumber = loans.CurrentLoan.LoanNumber,
LasedUsedByUser = loans.UserFullName
};
}
public void Send() {
}
}
class LoanMajorEventSender : LoanEventSenderBase<LoanMajorEvent>
{
public LoanMajorEventSender(ILoans loans, int majorEventNum)
: base(loans)
{
LoanEvent.MajorEventNum = majorEventNum;
Topic = string.Format("{0}.{1}", LoanEvent.GetType().Name, LoanEvent.MajorEventNum);
}
}
class LoanFieldEventSender : LoanEventSenderBase<LoanFieldEvent>
{
public LoanFieldEventSender(ILoans loans, LoanFieldEventArgs loanFieldEventArgs)
: base(loans)
{
LoanEvent.OldValue = loanFieldEventArgs.OldValue.ToString();
LoanEvent.NewValue = loanFieldEventArgs.NewValue.ToString();
LoanEvent.FieldName = loanFieldEventArgs.LoanField.DataDefinition.XmlName;
LoanEvent.FieldNumber = loanFieldEventArgs.LoanField.DataDefinition.FieldNumber;
Topic = string.Format("{0}.{1}", LoanEvent.GetType().Name, LoanEvent.FieldNumber);
}
}
答案 0 :(得分:1)
我已经接受了建设者的建议。
class Message<T> where T : LoanEvent
{
public T LoanEvent { get; protected set; }
public string Topic { get; protected set; }
}
class MessageSender
{
public void Send<T>(Message<T> message) where T : LoanEvent
{
}
}
abstract class MessageBuilder<T> : Message<T> where T : LoanEvent, new()
{
protected MessageBuilder(ILoans loans)
{
LoanEvent = new T
{
LoanNumber = loans.CurrentLoan.LoanNumber,
LasedUsedByUser = loans.UserFullName
};
}
}
class LoanMajorEventMessageBuilder : MessageBuilder<LoanMajorEvent>
{
public LoanMajorEventMessageBuilder(ILoans loans, int majorEventNum)
: base(loans)
{
LoanEvent.MajorEventNum = majorEventNum;
Topic = string.Format("{0}.{1}", LoanEvent.GetType().Name, LoanEvent.MajorEventNum);
}
}
class LoanFieldEventMessageBuilder : MessageBuilder<LoanFieldEvent>
{
public LoanFieldEventMessageBuilder(ILoans loans, LoanFieldEventArgs loanFieldEventArgs)
: base(loans)
{
LoanEvent.OldValue = loanFieldEventArgs.OldValue.ToString();
LoanEvent.NewValue = loanFieldEventArgs.NewValue.ToString();
LoanEvent.FieldName = loanFieldEventArgs.LoanField.DataDefinition.XmlName;
LoanEvent.FieldNumber = loanFieldEventArgs.LoanField.DataDefinition.FieldNumber;
Topic = string.Format("{0}.{1}", LoanEvent.GetType().Name, LoanEvent.FieldNumber);
}
}
答案 1 :(得分:0)
对我而言,此实现看起来更像是Command design pattern的一部分。它将请求封装为对象,从而允许使用不同的请求,队列或日志请求等对客户端进行参数化。
命名他们“发件人”可能是错误的,Sendmethod最好被移到另一个班级。
您可以使用 CommandInvoker 类,如前面提到的模式所示。