在运行时创建通知对象(电子邮件或页面) - 依赖注入或工厂

时间:2014-06-23 15:25:28

标签: c# .net dependency-injection factory

我有一些代码会在发生事件时通过电子邮件向我发送通知。现在我正在尝试添加一个页面, ALSO 删除对电子邮件的依赖。

供参考;我将要发送的通知的名称存储为数据库中的字符串。在运行时,我有一个人员列表和一个他们想要接收的字符串表示。

我最初认为使用ninject进行依赖注入,但是内核绑定变得很大,而且看起来我在一起攻击它。

然后我认为简单的工厂,Activator.CreateInstance(Email / Page)作为INotifcation,但我不知道如何处理不同的构造函数参数(除非我使用一个常见的复杂属性,如Employee,它具有所有我需要的信息。)

到目前为止,我有这样的事情:

public interface INotification
{
    void SendMessage();
}

public class Email: INotification
{
    private readonly string _toEmailAddress;

    private string Body
    {
        get
        {
          return "Email";
        }
    }

    private static string SmtpHost
    {
        get
        {
            return ConfigurationManager.AppSettings["SmtpHost"]; 
        }
    }

    public Email( string toEmailAddress)
    {
        _toEmailAddress = toEmailAddress;
    }

    public void SendMessage()
    {
        var requestEmail = new MailMessage
        {
            From = new MailAddress(FromEmailAddress, FromDisplayName),
        };
        requestEmail.To.Add(new MailAddress(_toEmailAddress));

        var smtp = new SmtpClient { Host = SmtpHost };
        smtp.Send(requestEmail);
    }
}

public class Page : INotification
{
    private string ToPagerNumber;

    public Page(string toPagerNumber)
    {
        ToPagerNumber = toPagerNumber;
    }

    private static string IpAddress
    {
        get
        {
            var host = new IPHostEntry();
            return host.AddressList.Where(a => a.AddressFamily == AddressFamily.InterNetwork).ToString();
        }
    }

    public void SendMessage()
    {
        var pageProxy = new Pager();
        var serviceResult = pageProxy.SendPage(ToPagerNumber, "Test", true, IpAddress);
    }

我当然感谢所有的反馈。我觉得我可以多次完成这项任务,但找到完美的解决方案(虽然我认为可能没有一个)已证明是繁重的。

谢谢大家!

0 个答案:

没有答案