2

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

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

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

但是,我的服务在没有参数的情况下运行良好。自从我添加它以来,我受到了打击:

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

有没有办法将此参数从对象数据源传递到我的服务层?或者也许有更好的方法来处理我的服务(然后是业务和数据层)知道当前存储在 Session[] 中的 UserID?

我发现的一种解决方法是在代码中声明参数:

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

}

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

4

2 回答 2

1

@civilator Thanks for your reply, I think it helped me too. Here is my version, translated to VB. Used this so that I can pass a parameter into the constructor of the object that is being created.

Protected Sub StaffDataSource_OnObjectCreating(sender As Object, e As ObjectDataSourceEventArgs)
    Dim newObj = New StaffService(Master.clsCU.UserId)
    e.ObjectInstance = newObj
End Sub
于 2016-05-31T15:49:19.387 回答
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;
    }
于 2016-02-02T15:29:31.623 回答