0

我在 aspx 页面中有以下代码:

<asp:ObjectDataSource id="odsOuterSource" TypeName="my.namespace.page"
SelectMethod="GetTestObject" DataObjectTypeName="my.namespace.Entities.TestObject" />

<asp:ObjectDataSource id="odsInnerSource" TypeName="my.namespace.page"
SelectMethod="GetAnotherTestObject" 
DataObjectTypeName="my.namespace.Entities.AnotherTestObject" />

以及代码隐藏中的以下代码:

public TestObject GetTestObject()
{
    Logic myLogic = new MyLogic();
    return myLogic.GetTestObject();
}

public AnotherTestObject GetAnotherTestObject()
{
    Logic myLogic = new MyLogic();
    return myLogic.GetAnotherTestObject(testObject);
}

现在我的问题是,是否有办法获取 OuterSource 返回的 TestObject,这样我就可以将它用于 InnerSource,而无需再次调用 GetTestObject。

我希望你能帮我解决这个问题。

编辑:为了比评论更好的可读性

感谢您的回答,但我对木杜的回答有疑问:

如果我的 OuterSource 有参数,有没有办法做到这一点?例如

<asp:ObjectDataSource id="odsOuterSource" TypeName="my.namespace.page"
SelectMethod="GetTestObject" DataObjectTypeName="my.namespace.Entities.TestObject">
    <SelectParameters>
        <asp:QueryStringParameter Name="id" QueryStringField="id" DefaultValue="0" />
    </SelectParameters>
</asp:ObjectDataSource>

因为这样即使我的 GetTestObject 也会有一个参数:

public TestObject GetTestObject(int id)
{
    Logic myLogic = new MyLogic();
    return myLogic.GetTestObject(id);
}
4

1 回答 1

1

您可以将其保存在成员中,作为TestObject或作为Lazy<TestObject>

private readonly Lazy<TestObject> myTestObject = new Lazy<TestObject>(() =>
{
    var myLogic = new MyLogic();
    return myLogic.GetTestObject();
});

使用此代码,您可以收到任意次数的代码。它将通过MyLogic一次获取并在后续调用中重新返回:

public TestObject GetTestObject()
{
    return this.myTestObject.Value;
}

public AnotherTestObject GetAnotherTestObject()
{
    var testObject = this.myTestObject.Value; // re-used

    Logic myLogic = new MyLogic();
    return myLogic.GetAnotherTestObject(testObject);
}

由于 ASP.NET 为每个请求创建页面的新实例,因此为每个请求Lazy<TestObject>重新创建对象。因此,您TestObject实际上是每个请求获取一次。

于 2012-11-14T14:15:55.527 回答