我需要替换229次出现的旧CSLA数据访问类,第一步是使用最少的可测试更改放置真正干净的填充代码。我快到了那里,并且尝试这样做而不必用接口来装饰所有BusinessClass
子代,以强制Fetch_Data
。
从BusinessBase
继承的每个类都将通过重写实现自己的Fetch_Data
。我已经完成了大部分工作,但是,您不能使用从虚拟版本中使用的类派生的参数来覆盖方法,方法签名不同,并且编译器不允许这样做。
有没有关于如何使下面的链在没有接口的情况下工作的提示,特别是如何在以下条件下通用地工作?
public class BusinessLayerBaseNoCSLA<T>
{
public virtual void Fetch_Data(BaseParameters parameters){ throw new NotWellConfiguredException();
}
扩展BusinessLayerBase:
public class Vehicle : BusinessLayerBaseNoCSLA<Vehicle>
{
public int VehicleId { get; set; }
public override void Fetch_Data(GetVehicleParameters parameters)//<--This line has a red squiggly because of the signature difference, no suitable method found to override.
{
//I could cast like var p = (GetVehicleParameters)BaseParameters; here but something smells bad about that
GetVehicleParameters p = parameters;
...
VehicleId = p.VehicleId;
}
}
DataPortal
使用static以避免更新和调用Fetch
,浓缩为一行代码。
public static class DataPortal
{
public static T FetchData<T>(object criteria) where T : BusinessLayerBaseNoCSLA<T>, new()
{
var result = new T();
result.Fetch_Data((BaseParameters)criteria);
return result;
}
}
所需用法
var Vehicle = DataPortal.FetchData<Vehicle>(new GetVehicleParameters({ VehicleId =1 });