我想重构下面的代码,我该如何注入通知处理程序?最小的原始代码更改和最佳重构(如有必要)。如何最好地重构此C#代码?
public class TestEventHandlers
{
public TestEventHandlers() { }
public void OpenMarket(Page page)
{
var Id = page.Request["MarketId"];
var repository = new EntityRepository();
IEntity market = repository.GetById(Id);
if (market.State != "Open")
{
throw new Exception("The market is not open!");
}
else
{
market.Open();
repository.SaveChangesTo(market);
var smtpClient = new SmtpClient();
var message = new MailMessage();
message.Subject = "market open";
message.Body = market.ToString() + " was open.";
message.To.Add(new MailAddress("[email protected]"));
smtpClient.Send(message);
}
}
public void CloseMarket(Page page)
{
var Id = page.Request["MarketId"];
var repository = new EntityRepository();
IEntity market = repository.GetById(Id);
if (market.State == "Close")
{
throw new Exception("The market is already close!");
}
else
{
market.Close();
repository.SaveChangesTo(market);
var smtpClient = new SmtpClient();
var message = new MailMessage();
message.Subject = "market closed";
message.Body = market.ToString() + " has been closed.";
message.To.Add(new MailAddress("[email protected]"));
smtpClient.Send(message);
}
}
}
我已经重构它像下面 -
public class TestEventHandlers
{
public TestEventHandlers() { }
public void OpenMarket(Page page)
{
var Id = page.Request["MarketId"];
if (id!=null)
{
var repository = new EntityRepository();
IEntity market = repository.GetById(Id);
if (market.State != "Open")
{
throw new Exception("The market is not open!");
}
else
{
market.Open();
repository.SaveChangesTo(market);
SendEmailNotification("market open", market.ToString() + " was open.", "[email protected]");
}
}
else
{
throw new Exception("Id can not be null");
}
}
private static void SendEmailNotification(string subject,string body,string emailAddress)
{
var smtpClient = new SmtpClient();
var message = new MailMessage();
message.Subject = subject;
message.Body = body;
message.To.Add(new MailAddress(emailAddress));
smtpClient.Send(message);
}
public void CloseMarket(Page page)
{
var Id = page.Request["MarketId"];
if(id!=null)
{
var repository = new EntityRepository();
IEntity market = repository.GetById(Id);
if (market.State == "Close")
{
throw new Exception("The market is already close!");
}
else
{
market.Close();
repository.SaveChangesTo(market);
SendEmailNotification("market closed", market.ToString() + " has been closed.", "[email protected]");
}
}
else
{
throw new Exception("Id can not be null");
}
}
}
你可能想合并'CloseMarket'和'OpenMarket'。您只能将其状态更改为关闭或打开。一个参数可以将2种方法减少到1. – Badiparmagi
我会与Badipamagi的建议一起使用。也请开始添加空检查。 SendNotification中也可以使用相同的新参数。如果你没有在其他地方使用发送通知,你可以合并它,但从测试点,并保持分离的担忧,你可以保持原样。 –
也添加了null检查,但它并不是一个好主意,因为它对现在使用两种方法的其他类和方法进行了巨大的重构,即“OpenMarket(Page page) and CloseMarket(Page page)' – Neo