有没有办法 - 在ASP.Net中 - 从代码中的另一个ObjectDataSource访问一个ObjectDataSource的对象?

时间:2012-11-14 14:08:42

标签: c# asp.net web-applications

我在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。

我希望你能帮助我。

编辑:为了更好的可读性而不是评论

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

如果我的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);
}

1 个答案:

答案 0 :(得分: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