Create an interface for the datacalls you want. Create an implentation of each of these for DB, WS etc (Strategy Pattern). You are basically creating a strategy pattern for your DAL calls. You can extend this to MSMQ qnd even add a composite pattern to use two at the same time or automatic rollovers should one become unavailable. Oh and create youself a factory for loading teh concrete types.
public interface DALFacade
{
public Order GetOrders();
}
public class WebServiceDALFacade
{
public Order GetOrders(){...call webservice DAL.}
}
public class DataBaseDALFacade
{
public Order GetOrders(){
..Here you can load the dataprovider by a factory class.
DataProvider provider = DataProvider.CreateProvider( some variable to determine sql, oracle etc.
provider.createparamter(.......);
provider.createClobParameter(.........);
IDataReader reader = provider.ExecuteReader(...................);
Build Order from reader (create as a seperate method and loop through fields setting values using the field name. This way you can reuse the build for every db command that builds an order object. rather than creating crazy new(...............................................................) with 100 params everytime you create the object. My view is the order of a stored procedure is much more likely to change than the field names.
}
}