C# 在用户控件之间共享数据而不访问Page类

C# 在用户控件之间共享数据而不访问Page类,c#,asp.net,webforms,user-controls,C#,Asp.net,Webforms,User Controls,我有两个用户控件,每个控件都需要调用相同的服务来获取一些数据。由于这两个用户控件位于同一页上,这将导致调用服务两次,从性能角度来看,这并不理想 这些控件是CMS的一部分,所以我没有访问aspx页面的权限-我的意思是,我不能向page类添加属性并使用它 我认为可以这样做的一种方法是将数据存储在用户会话中 因此,每个用户控件都将检查会话,如果它为null,它将调用服务并填充会话 除了使用会话,我还有哪些选择 编辑:每个用户控件都需要调用以下服务,这是CMS的一部分: var personaliza

我有两个用户控件,每个控件都需要调用相同的服务来获取一些数据。由于这两个用户控件位于同一页上,这将导致调用服务两次,从性能角度来看,这并不理想

这些控件是CMS的一部分,所以我没有访问aspx页面的权限-我的意思是,我不能向page类添加属性并使用它

我认为可以这样做的一种方法是将数据存储在用户会话中

因此,每个用户控件都将检查会话,如果它为null,它将调用服务并填充会话

除了使用会话,我还有哪些选择

编辑:每个用户控件都需要调用以下服务,这是CMS的一部分:

 var personalizationService = new PersonalizationService();
 var userSegments = personalizationService.GetUserSegments();
 //get data based on userSegments
问题是-这两个用户控件可以在同一个页面上,但在某个时候,用户可能会决定删除其中一个用户控件,或者在页面中添加第三个用户控件


谢谢这是个坏主意。用户控件应该是自包含的,并且不了解其环境。设想一个网格视图

Aspx

GridView
不会从会话中提取数据,您也不应该!相反,在用户控件中设置一个属性以传入数据

如果数据在当前页面之外具有相关性,那么您可以将其存储在会话中,但是用户控件不应该从会话中提取数据,您的页面应该从会话中提取数据并将其传递给用户控件

if(Session["ImportantData"] == null)
    {
    Session[ImportantData] = Database.GetImportantData();
    }
MyUserControl1.Data = Session["ImportantData"] as ImportantDataClass;
MyUserControl2.Data = Session["ImportantData"] as ImportantDataClass;

回应您的编辑

var personalizationService = new PersonalizationService();
MyUserControl1.PersonalizationService = personalizationService;
MyUserControl2.PersonalizationService = personalizationService;
顺便说一句,你不应该做
newpersonalizationservice()理想情况下,您应该从依赖项注入中获得,这样您就可以从一个集中的位置交换实现。我倾向于使用Ninject,它可以进行属性注入

[Ninject]
public IPersonalizationService personalizationService {get; set;}

protected void Page_Load(object sender, EventArgs e)
{
    MyUserControl1.PersonalizationService = personalizationService;
}

是的,这就是我想做的,但是我想知道是否有更好的方法。请参阅上面的“我的编辑”页面的加载事件中正在发生设置用户控件的PersonalizationService属性的代码,对吗?而且页面还假设这两个用户控件位于该页面上,如果用户决定删除其中一个,则情况可能并非如此。我想得越多,就越相信这次会议是唯一的机会option@VeselinVasilev是的,我的假设是它发生在页面的加载事件中。但这并不意味着会话是唯一的选择,甚至不是一个好的选择。如果要动态添加用户控件,则在添加控件时将服务传递给这些控件。就这么简单。例如,
public void AddControl1(){/*将控件添加到页面*/control.PersonalizationService=PersonalizationService;}
不要使用会话,用户控件应该是自包含的,并且不依赖于其环境。同意您的意见,但这些用户控件是CMS中的小部件,内容编辑器可以随时在任何页面上拖放它们。所以,这让事情变得有点复杂。@VeselinVasilev不,它不复杂。在添加小部件时运行一些代码,并将服务传递给它。
var personalizationService = new PersonalizationService();
MyUserControl1.PersonalizationService = personalizationService;
MyUserControl2.PersonalizationService = personalizationService;
[Ninject]
public IPersonalizationService personalizationService {get; set;}

protected void Page_Load(object sender, EventArgs e)
{
    MyUserControl1.PersonalizationService = personalizationService;
}