我正在构建通用sharepoint DALL,所以我需要一个帮助。 我不知道这是否适用,但逻辑上一定是这样。
我的问题是我的gr8 TTL不确定他需要使用什么数据源:S(SQL或SharePoint列表),他需要为项目开始开发。
所以我需要构建DAL,因为SP列表是我的数据源,因此将来的变化将是最小的。
现在我所拥有的是baseDAL,包括所有常见的操作,如delete,getAll ,,,等
myBase dal类现在类似于
public class BaseDAL<T> where T : BaseInfo,new()
{
public virtual List<T> GetAllItem()
{
//code to read from any data source and return data
}
public virtual Boolean Delete(T entity)
{
int entityID = ((BaseInfo)entity).ID;
deleteEntity(entityID);
}
}
我将baseInfo calss作为主要业务对象实体。
并且假设我有两个业务实体(员工,学生)和两个DAL一个用于员工,一个用于学生
所以我在想的是在getAllItem中实现基于T类型返回所有项目的代码,所以代码可能在baseDAL中看起来像下面
public virtual List<T> GetAllItem()
{
SPListItemCollection items = //code to read from list please note that list name saved in baseInfo object
T.getBusinessListItems(items); //toList
}
在EmployeeDAL中我实现了SPListItemCollection与业务实体之间的映射器函数,代码将是samiliare到此
public virtual List<Employee> getBusinessListItems(SPListItemCollection items)
{
//loop the items and fill them in list of employee objects
return list<Employee>
}
希望这澄清一下这个案例,我不知道这是不是写作方式我不是一个技术人员。如果还有其他方法可以帮助。
答案 0 :(得分:0)
不确定这是否是你想要的,但它可能会有所帮助:
object someDal = ...; //you don't know the exact type
var list = ((dynamic)someDal).GetAllItem();
C#dynamic已经为您解决了这个问题。
答案 1 :(得分:0)
最后我设法做到了, 我使用下面的代码,我认为它的反射我不确定,
public virtual List<T> GetAllItems(Type DalType)//this is baseDAL
{
MethodInfo methodInfo = DalType.GetMethod("ConvertToBusinessEntities");
object[] parametersArray = new object[] { itemCollection };
object classInstance = Activator.CreateInstance(DalType, null);
return (List<T>)methodInfo.Invoke(classInstance, parametersArray);
}
我只需要传递DalType来知道从哪个类调用该方法,如果确保所有DAL都将实现ConvertToBusinessEntities方法,我可以通过接口来管理代码。 我希望这个代码结构足够强大...... 它毕竟不是死路一条:) ,,,