我有两个用户控件,每个用户控件都需要调用相同的服务来获取一些数据。由于这两个用户控件位于同一页面上 - 这将导致两次调用服务,从性能角度来看这并不理想。
这些控件是CMS的一部分,因此我无法访问aspx页面 - 我的意思是,我无法向Page类添加属性并使用它。
我认为可以做到的一种方法是将数据存储在用户会话中。
因此,每个用户控件都会检查Session,如果它为null,它将调用该服务并填充Session。
除了使用会话之外,我有哪些选择?
编辑:每个用户控件都需要调用以下服务,该服务是CMS的一部分:
var personalizationService = new PersonalizationService();
var userSegments = personalizationService.GetUserSegments();
//get data based on userSegments
问题是 - 这两个用户控件可以在同一页面上,但在某些时候用户可能决定删除其中一个用户控件,或者向页面添加第三个用户控件。
由于
答案 0 :(得分:1)
这是一个坏主意。用户控件应该是自包含的,不了解其环境。想想网格视图。
.aspx的
<asp:GridView runat="server" id="GridView1" />
<asp:GridView runat="server" id="GridView2" />
背后的代码
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
{
DataTable dt = Database.GetDataTable();
GridView1.DataSource = dt;
GridView2.DataSoure = dt;
GridView1.DataBind();
GridView2.DataBind();
}
}
GridView
不会从会话中提取数据,你也不应该!而是在用户控件中设置一个属性以传递数据。
如果数据仅在当前页面之外具有相关性,那么您可能将其存储在会话中,但是用户控件不应该从会话中提取数据,您的页面应该提取数据来自Session并将其传递给用户控件
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;
顺便说一句,你不应该new PersonalizationService();
理想情况下,你应该从依赖注入中获取,所以你可以从集中位置交换实现。我倾向于使用Ninject,它可以进行属性注入。
[Ninject]
public IPersonalizationService personalizationService {get; set;}
protected void Page_Load(object sender, EventArgs e)
{
MyUserControl1.PersonalizationService = personalizationService;
}