【问题标题】:N Layer .Net Message managementN层.Net消息管理
【发布时间】:2013-11-12 02:41:31
【问题描述】:

我正在开发一个 N 层 Web 应用程序(UI/Service/DAL)。

在调用某个服务时,服务层内部有时会出现需要用户通知的事件。

我应该如何将这些消息从服务层传递到 UI 层?

请务必注意,这些消息不是错误,而只是某些事件的通知。

【问题讨论】:

  • 这些事件是在服务调用完成后发生还是在服务调用期间发生?如果是前者,你可以把消息放在返回值中。您要显示什么类型的消息?如果是像“你确定要删除X吗?”这样的确认,你的UI应该解决这个问题,而不是你的服务。请用一个实际的例子,最好是一些代码来解释你想要做什么。
  • 消息的类型有点像这样:'你已经成功创建了你的第一篇文章,恭喜!'不知道为什么,但我一直使用 BOOLEAN 作为我的服务调用的返回类型...也请对此发表评论。
  • 这就是可以使用 ViewModel 的地方,string ResultMessage。您的 UI 层(例如,MVC 控制器)将 result.Success 布尔值转换为字符串消息,例如使用资源文件,并将其分配给视图模型。这样您就可以在不更改服务的情况下更改 UI 语言。
  • 在我的服务层调用中使用 POCO 作为结果类型好吗?顺便说一句,模型重用有问题吗? (在视图中用作模型,在服务层中用作结果类型/参数传递)
  • 这是一个完全不同的问题,请参阅POCO classes and ViewModels in MVC3 获取一些意见。正如那里所说,这取决于项目的规模。如果您有平面的、一对一的映射实体和视图,请继续。不过,您只是遇到了模型重用的问题:您不想将特定于视图的属性添加到实体模型中。如果需要,可以使用[NotMapped]

标签: .net design-patterns service-layer n-layer


【解决方案1】:

您可以通过依赖注入来实现它。假设你有一个IUserNotificator 这样的通用接口:

interface IUserNotificator{
    //message type can be Warning, Success, Error or Confirmation
    void Notify(string message, MessageType messageType);
}

你的服务类做这样的事情:

class Service{
    // construtor injection of IUserNotificator

    void DoSomething(){
        // doing something
        if(error){
            IUserNotificator.Notify("There is error", MessageType.Error);
        }
        else{
            IUserNotificator.Notify("Operation success", MessageType.Success);
        }
    }
}

这样,您可以在 UI 级别有不同的实现。假设您有一个 C# winform 应用程序:

class MessageBoxUserNotificator : IUserNotificator{
    void Notify(string message, MessageType messageType){
        if(messageType == MessageType.Error){ 
            MessageBox.Show(message, "Notification", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        else{
            MessageBox.Show(message, "Notification");
        }
    }
}

为了获得更大的灵活性,可以在一次操作中使用多个通知器的装饰器来扩展类。

【讨论】:

  • 在这种情况下,在服务和 UI 层之间注入依赖是否安全?
  • 就是依赖注入的目的,就是将依赖从UI注入到服务层。在服务层,你是在做与接口相关的代码,而该接口是在 UI 层实现的。在 UI 层本身中使用了服务,因此在 UI 层中注入依赖项是安全的
猜你喜欢
  • 2011-01-24
  • 1970-01-01
  • 2010-10-22
  • 2010-10-13
  • 1970-01-01
  • 2012-02-03
  • 2010-09-17
  • 2016-03-15
  • 2015-04-18
相关资源
最近更新 更多