我正在使用TDD在C#中开发一个简单的服务定位器。
此刻,我已经创建了一个TryAddService
方法,如下所示:
public bool TryAddService(Type type, object service)
{
if (service == null)
{
return false;
}
if (this.services.ContainsKey(type))
{
return false;
}
if (!type.IsAssignableFrom(service.GetType()))
{
return false;
}
this.services.Add(type, service);
return true;
}
我的问题是,在所有这些情况下我应该返回假吗?还是应该抛出异常?
在这种情况下,我的客户将是其他开发人员。
答案 0 :(得分:0)
我使用这种情况: 我有一个所有服务都返回该类的类(例如MyReturn)
public sealed class MyReturn<TEntity> : IDisposable
{
public string Message { get; set; }
public TEntity Entity { get; set; }
public string SysException { get; set; }
// and etc...
public void Dispose() {}
}
现在为您服务:
public MyReturn <bool> TryAddService(Type type, object service)
{
if (service == null)
return new MyReturn <bool> {Message = "Your messgage"};
//and etc...
return new MyReturn <bool>();
}
在您的表单中,选中Message,如果为null或为空,则没有错误...。 您可以自定义它...
答案 1 :(得分:0)
根据非正式协议,每当您使用TryXXXX模式时,您的方法必须始终成功,但是将实际成功结果返回为布尔值。如果要抛出异常,则只需从方法名称中删除“ try”一词即可。
在顶部,如果您遵循TryXXXX模式,建议您添加一个try-catch块,以确保您的方法确实总是成功:
public bool TryAddService(Type type, object service)
{
if (service == null)
{
return false;
}
if (this.services.ContainsKey(type))
{
return false;
}
if (!type.IsAssignableFrom(service.GetType()))
{
return false;
}
try
{
this.services.Add(type, service);
}
catch
{
return false;
}
return true;
}
答案 2 :(得分:0)
在这种情况下,我的客户将是其他开发人员。
您是否希望班级的使用者将有条件地注册类型?
if (TryAddService(typeof(IService), new Service1()))
{
// Added successfully - what to do next
}
else
{
// What here? Try another service?
}
否则,开发人员将只注册所需的实现,并依靠TryAddService
在应用程序启动期间会引发异常的事实。
TryAddService(typeof(IService), new Service1());
作为开发人员,如果我做错了什么,我想尽快获得最快的反馈。在应用程序启动过程中(通常完成服务注册)抛出异常将是最快的反馈。除非您使用具有约束的泛型,否则泛型会在编译时提早提供反馈。
如果开发人员没有失败注册的逻辑,则不返回任何内容,而是使用描述性消息引发自定义异常
public void TryAddService(Type type, object service)
{
if (service == null)
{
throw new RegisterServiceException($"Can not register null for type '{type.FullName}'");
}
if (this.services.ContainsKey(type))
{
throw new RegisterServiceException($"Service for type '{type.FullName}' already registerd.");
}
if (!type.IsAssignableFrom(service.GetType()))
{
throw new RegisterServiceException($"Type '{type.FullName}' should be assignable from service of type '{service.GetType().FullName}'");
}
this.services.Add(type, service);
}