0

我正在构建通用共享点 DALL,所以我需要帮助。我不知道这是否适用,但从逻辑上讲它必须是。

我的问题是我的 gr8 TTL 不确定他需要使用的数据源是什么:S(SQL 或 SharePoint 列表),他需要开始项目的开发。

所以我需要构建 DAL,因为 SP 列表是我的数据源,所以未来的变化将是最小的。

现在我拥有的是 baseDAL,其中包括所有常见操作,如删除、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 类作为主要业务对象实体。

假设我有两个业务实体(员工、学生)和两个 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 到业务实体之间实现了一个映射器函数,代码将与此类似

public virtual List<Employee> getBusinessListItems(SPListItemCollection items)
{

  //loop the items and fill them in list of employee objects
  return list<Employee>

}

希望这能澄清情况,我不知道这是否是写作方式,我不是一个技术人员。如果有其他方法可以做到这一点,请帮忙。

4

2 回答 2

0

不确定这是否是您想要的,但它可能会有所帮助:

object someDal = ...; //you don't know the exact type
var list = ((dynamic)someDal).GetAllItem();

C# dynamic 已经为您解决了这个问题。

于 2012-12-09T12:39:58.270 回答
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 方法,我可以通过接口管理该方法,代码将起作用。我希望这种代码结构足够强大......毕竟它不是死胡同:) ,,,

于 2012-12-10T11:11:48.730 回答