我有一个WCF服务合同实现,可以用作普通dll或Web服务。有没有办法确定(从其代码中)如何使用它。 更具体地说,我需要在这些情况下抛出不同的例外。
谢谢
答案 0 :(得分:1)
我不确定您的具体要求,但似乎 plain dll 是标准的业务逻辑库。根据我的经验,我建议尽可能地将业务逻辑作为实现不可知(当然,在合理范围内),因为您可能会以不同方式处理异常。通过基于实现抛出不同的异常,您将把业务逻辑的职责与实现者的职责混合在一起。
我的建议是从业务逻辑库中抛出一组常见的异常,并为每个实现捕获/处理它们。例如。控制台应用程序可能只是再次请求输入,因为WCF应用程序可能会抛出错误异常。
以下面的代码为例:
// Simple business logic that throws common exceptions
namespace BusinessLogicLibrary
{
public class Math
{
public static int Divide(int dividend, int divisor)
{
if (divisor == 0)
throw new DivideByZeroException();
return dividend / divisor;
}
}
}
// WCF calls to business logic and handles the exception differently
namespace WcfProject
{
[ServiceContract]
public interface IService
{
[OperationContract]
int Divide(int dividend, int divisor);
}
public class Service : IService
{
public int Divide(int dividend, int divisor)
{
try
{
return BusinessLogicLibrary.Math.Divide(dividend, divisor);
}
catch (Exception ex)
{
throw new FaultException(
new FaultReason(ex.Message),
new FaultCode("Division Error"));
}
}
}
}
// Console application calls library directly and handles the exception differently
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
ShowDivide();
}
static void ShowDivide()
{
try
{
Console.WriteLine("Enter the dividend: ");
int dividend = int.Parse(Console.ReadLine());
Console.WriteLine("Enter the divisor: ");
int divisor = int.Parse(Console.ReadLine());
int result = BusinessLogicLibrary.Math.Divide(dividend, divisor);
Console.WriteLine("Result: {0}", result);
}
catch (DivideByZeroException)
{
// error occurred but we can ask the user again
Console.WriteLine("Cannot divide by zero. Please retry.");
ShowDivide();
}
}
}
}
答案 1 :(得分:0)
足够公平。在这种情况下,您可以检查库中的各种上下文。
WCF
bool isWcf = OperationContext.Current != null;
网络
bool isWeb = System.Web.HttpContext.Current != null;