我有一个服务层,它公开了一些方法,这些方法在我的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,主要是出于日志和角色管理的原因。
答案 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