使用带有Constructor的服务类的ObjectDataSource

时间:2013-07-20 03:46:58

标签: c# asp.net objectdatasource

我有一个服务层,它公开了一些方法,这些方法在我的asp.net应用程序的 ObjectDataSource 中使用。

服务类的构造函数有一个参数,它只是一个int,用于跟踪当前登录的用户:

public ProjectService(int userId)
{
    _userId = userId;
    pb = new ProjectBusiness(_userId);
}

但是,我的服务在没有参数的情况下工作正常。自从我添加它以来,我受到了打击:

  

没有为此对象定义无参数构造函数。

有没有办法将此参数从objectdatasource传递到我的服务层?或者可能有一种更好的方法来处理我的服务(然后是业务和数据层)知道UserID,它目前存储在Session []中?

我找到的解决方法是在代码中声明参数:

protected void ChargeRatesODS_ObjectCreating(object sender, ObjectDataSourceEventArgs e)
{
    var service = new ResourceService(Common.CurrentUserId());
    e.ObjectInstance = service;

}

这是唯一的方法,也是最好的做法,然后我可以坚持下去,但是......这是处理参数的方法吗?我希望构造函数有一个参数,这样它就会强制开发人员传入一个有效的UserID,主要是出于日志和角色管理的原因。

2 个答案:

答案 0 :(得分:1)

我在这里发布我的解决方案,因为它最初出现在我的搜索中。 我们的项目使用了基于所请求数据的不同类型的通用服务类,并且具有与此类似的签名

public class ReportDataService<T, U> 

并且构造函数具有会话ID,因此我们可以为每个会话保留一些总计,如下所示。

 public ReportDataService(string sessionGuid)

因此它在页面中工作的唯一方法是使用类型激活器,因此它同时满足不同的泛型类型和不同的构造函数参数(下面的代码在.aspx.cs中)。

  void DataSource_ObjectCreating(object sender, ObjectDataSourceEventArgs e)
    {

        var myType = ((ObjectDataSourceView)sender).TypeName;
        var newObj = Activator.CreateInstance(  Type.GetType( myType, false), new object[] { sessionId });
        e.ObjectInstance = newObj;
    }

答案 1 :(得分:1)

@civilator感谢您的回复,我认为这也对我有所帮助。这是我的版本,翻译成VB。使用它,以便我可以将参数传递给正在创建的对象的构造函数。

Protected Sub StaffDataSource_OnObjectCreating(sender As Object, e As ObjectDataSourceEventArgs)
    Dim newObj = New StaffService(Master.clsCU.UserId)
    e.ObjectInstance = newObj
End Sub