2011-05-06 70 views
0

假设我有一个服务类为我和一个使用此服务的消费者类做了一些事情。服务依赖于向消费者抛出异常,当它提供一些不起作用的东西时。从消费类获取警告

一切都很好,我可以很容易地从消费方面捕捉这些例外,并对他们做一些有用的事情。就像向用户显示消息一样。

但是,如果服务遇到不好的事情,但不是真正的错误。用户可能会提供一些信息,说:“不要这样做,它会工作,但你可能犯了一个错误”。警告是。

您将如何去通知此警告的消费者类,以便它可以例如显示给用户?将服务的某种警告服务(很像记录器)传递给服务,然后检查服务完成后是否有任何警告的唯一方法?

我也应该说服务是在我的域名内,所以我可以做很多我想要的。

回答

1

你有没有想过你的消费类抛出事件,并让你的服务类订阅他们? See here

+0

我假设你的意思是颠倒了,作为服务投掷事件。但不,没有想过。尽管这可能是解决问题的有效方法。让我们看看是否有人有任何其他想法:) – 2011-05-06 14:58:54

0

我会考虑环绕整个服务呼叫到一个背景下,这样的事情:

class CallContext<TInput, TOutput> 
{ 
    TInput InputValue { get; set; } 

    TOutput OutputValue { get; set; } 

    ICollection<String> Warnings { get; set; } 
} 

class MyService 
{ 
    void SomeOperation(CallContext<int, int> context) 
    { 
     context.OutputValue = context.InputValue * 2; 

     if (context.IntputValue < 0) 
      context.Warnings.Add("Input value less than zero may have undesired results."); 
    } 
} 

的服务是很乐意与操作继续,尽管事实上,它已经认识到一些奇特与输入。它不会停止该功能的运行,但该服务能够警告呼叫者,结果可能是意外的。

class Consumer 
{ 
    void CallService() 
    { 
     var context = new Context<int, int>() 
     { 
      InputValue = -1; 
     } 

     myService.SomeOperation(context); 

     Console.WriteLine(context.OutputValue); 

     foreach(string warning in context.Warnings) 
      Console.Writeline(warning); 
    } 
} 
+0

我可以看到你的解决方案中的一个点。然而,这与传递一个List ()对象作为额外参数并在完成时检查它是否出现警告并没有多大区别。我认为Context类使SomeOperation输入有点模糊。 – 2011-05-06 16:18:24

+1

也许这比在将它发送到服务之前验证输入*要好?这样,您可以向用户提出警告消息,并提示他们是否仍想继续操作?这需要另一个熟悉服务类内部工作的类......你可以使用第三方库如FluentValidation。 – MattDavey 2011-05-10 07:44:47