c#站点所有页面上使用的变量所需的想法
我有一个网站,提供伪子域为基础的网站。每个子域都有一组我需要在所有页面上访问的设置(即字符串名称、字符串css、字符串标题)。为了便于访问,最好的存储方式是什么 我无法使用webconfig,因为不同的子域有自己的设置集合,所以我将设置存储在sql server上。我想用不同的缓存名称缓存所有设置,但我担心内存占用。不管如何使用缓存,我知道我需要编写某种类型的类,将每个设置作为属性公开c#站点所有页面上使用的变量所需的想法,c#,caching,C#,Caching,我有一个网站,提供伪子域为基础的网站。每个子域都有一组我需要在所有页面上访问的设置(即字符串名称、字符串css、字符串标题)。为了便于访问,最好的存储方式是什么 我无法使用webconfig,因为不同的子域有自己的设置集合,所以我将设置存储在sql server上。我想用不同的缓存名称缓存所有设置,但我担心内存占用。不管如何使用缓存,我知道我需要编写某种类型的类,将每个设置作为属性公开 有什么想法吗?为什么不对页面或母版页进行子类化,然后公开您的属性 在一个C#文件中 在所有的ASPX文件中 &
有什么想法吗?为什么不对
页面
或母版页
进行子类化,然后公开您的属性
在一个C#文件中
在所有的ASPX文件中
<%@ Page Language="C#" Inherits="MyNamespace.MyPage" %>
为什么不对
页面
或母版页
进行子类化,然后公开您的属性
在一个C#文件中
在所有的ASPX文件中
<%@ Page Language="C#" Inherits="MyNamespace.MyPage" %>
我对我编写的一些在共享服务器上托管的软件做了类似的事情。根据域的不同,我最终会有不同的皮肤和一些配置选项 根目录下是“Site”类,该类包含站点标题、描述和一些其他基本信息。然后它还保留一个属性列表 这些表如下所示:
Create Table [Site](
[Id] uniqueidentifier default newSequentialId(),
[Name] nvarchar(128),
[Description] nvarchar(512),
Constraint pk_Site Primary Key (Id)
)
Create Table [Attribute](
[Id] int identity(1,1),
[Key] varchar(128),
[Type] varchar(16),
[OwnerMask] int,
Constraint pk_AttributeId Primary Key (Id),
Constraint uq_AttributeKey Unique ([Key])
)
Create Table [AttributeValue](
[OwnerId] uniqueidentifier,
[AttributeId] int,
[Value] nvarchar(512),
Constraint pk_Owner_Attrib Primary Key (OwnerId, AttributeId)
)
我之所以使用guid,是因为我希望能够将属性附加到不同的对象,并能够通过对象id查找它们。所有者任务是确定不同属性对哪些对象有效。这对您来说是可选的
每个可以具有属性的类都实现此接口:
public interface IPropertyContainer
{
void AddProperty(Property property);
string FindPropertyValue(string name);
Property FindProperty(string name);
void SetPropertyValue(string name, string value);
}
我对名称的差异(属性与属性)感到遗憾,但处理属性也是.NET Framework中预定义的类这一事实变得很烦人。Site类实现此接口
public string Theme
{
get { return FindPropertyValue("Theme") ?? "default"; }
}
然后,我有一个服务,它检查请求进入的域,并检查数据库以查看映射的站点Id。然后,我使用HttpModule将site对象加载到HttpContext中。我将包括下面的代码,但可能不清楚上下文:
private static void AuthenticateRequestHandler(object sender, EventArgs e)
{
HttpApplication app = sender as HttpApplication;
if(app == null) return;
Uri url = app.Request.Url;
string domain = url.Host;
string path = url.AbsolutePath.ToLower().Replace("default.aspx", "");
IInjectionWrapper wrapper = new WindsorWrapper();
ISiteProvider provider = wrapper.Resolve<ISiteProvider>();
Site site = provider.FindSiteByDomain(domain);
if (site == null)
return;
ActiveContext.Current.Site = site;
}
Theme
属性正在包装对IPropertyContainer
接口上的一个方法的调用
public string Theme
{
get { return FindPropertyValue("Theme") ?? "default"; }
}
希望这个冗长的例子能给你一个起点
更新
我意识到您可能不熟悉HttpContext
或者我对ActiveContext
类所做的工作。基本上,我使用ActiveContext
类为HttpContext.Items
和HttpContext.session
n集合提供强类型包装
会话数据从一个调用持续到下一个调用,但在负载平衡的情况下可能会导致问题<代码>HttpContext。项目仅在当前请求期间存在。下面是我的ActiveContext
类的代码,通过调用静态方法ActiveContext.Current
公共类ActiveContext:IActiveContext
{
私人网站(u网站),
public static IActiveContext Current
{
get
{
IActiveContext activeContext;
activeContext = Context.Items["ActiveContext"] as ActiveContext;
if (activeContext == null)
{
activeContext = new ActiveContext();
Context.Items["ActiveContext"] = activeContext;
}
return activeContext;
}
}
public Person AuthenticatedUser
{
get
{
Person person = Context.Session["AuthenticatedUser"] as Person;
return person;
}
set { Context.Session["AuthenticatedUser"] = value; }
}
public Site Site
{
get { return Context.Items["CurrentSite"] as Site; }
set { Context.Items["CurrentSite"] = value; }
}
private static HttpContext Context
{
get
{
HttpContext context = HttpContext.Current;
if (context == null)
throw new Exception("HttpContext is null");
return context;
}
}
}我对我编写的一些软件做了类似的操作,这些软件是在共享服务器上托管的。根据域的不同,我最终会有不同的皮肤和一些配置选项 根目录下是“Site”类,该类包含站点标题、描述和一些其他基本信息。然后它还保留一个属性列表 这些表如下所示:
Create Table [Site](
[Id] uniqueidentifier default newSequentialId(),
[Name] nvarchar(128),
[Description] nvarchar(512),
Constraint pk_Site Primary Key (Id)
)
Create Table [Attribute](
[Id] int identity(1,1),
[Key] varchar(128),
[Type] varchar(16),
[OwnerMask] int,
Constraint pk_AttributeId Primary Key (Id),
Constraint uq_AttributeKey Unique ([Key])
)
Create Table [AttributeValue](
[OwnerId] uniqueidentifier,
[AttributeId] int,
[Value] nvarchar(512),
Constraint pk_Owner_Attrib Primary Key (OwnerId, AttributeId)
)
我之所以使用guid,是因为我希望能够将属性附加到不同的对象,并能够通过对象id查找它们。所有者任务是确定不同属性对哪些对象有效。这对您来说是可选的
每个可以具有属性的类都实现此接口:
public interface IPropertyContainer
{
void AddProperty(Property property);
string FindPropertyValue(string name);
Property FindProperty(string name);
void SetPropertyValue(string name, string value);
}
我对名称的差异(属性与属性)感到遗憾,但处理属性也是.NET Framework中预定义的类这一事实变得很烦人。Site类实现此接口
public string Theme
{
get { return FindPropertyValue("Theme") ?? "default"; }
}
然后,我有一个服务,它检查请求进入的域,并检查数据库以查看映射的站点Id。然后,我使用HttpModule将site对象加载到HttpContext中。我将包括下面的代码,但可能不清楚上下文:
private static void AuthenticateRequestHandler(object sender, EventArgs e)
{
HttpApplication app = sender as HttpApplication;
if(app == null) return;
Uri url = app.Request.Url;
string domain = url.Host;
string path = url.AbsolutePath.ToLower().Replace("default.aspx", "");
IInjectionWrapper wrapper = new WindsorWrapper();
ISiteProvider provider = wrapper.Resolve<ISiteProvider>();
Site site = provider.FindSiteByDomain(domain);
if (site == null)
return;
ActiveContext.Current.Site = site;
}
Theme
属性正在包装对IPropertyContainer
接口上的一个方法的调用
public string Theme
{
get { return FindPropertyValue("Theme") ?? "default"; }
}
希望这个冗长的例子能给你一个起点
更新
我意识到您可能不熟悉HttpContext
或者我对ActiveContext
类所做的工作。基本上,我使用ActiveContext
类为HttpContext.Items
和HttpContext.session
n集合提供强类型包装
会话数据从一个调用持续到下一个调用,但在负载平衡的情况下可能会导致问题<代码>HttpContext。项目仅在当前请求期间存在。下面是我的ActiveContext
类的代码,通过调用静态方法ActiveContext.Current
公共类ActiveContext:IActiveContext
{
私人网站(u网站),
public static IActiveContext Current
{
get
{
IActiveContext activeContext;
activeContext = Context.Items["ActiveContext"] as ActiveContext;
if (activeContext == null)
{
activeContext = new ActiveContext();
Context.Items["ActiveContext"] = activeContext;
}
return activeContext;
}
}
public Person AuthenticatedUser
{
get
{
Person person = Context.Session["AuthenticatedUser"] as Person;
return person;
}
set { Context.Session["AuthenticatedUser"] = value; }
}
public Site Site
{
get { return Context.Items["CurrentSite"] as Site; }
set { Context.Items["CurrentSite"] = value; }
}
private static HttpContext Context
{
get
{
HttpContext context = HttpContext.Current;
if (context == null)
throw new Exception("HttpContext is null");
return context;
}
}
}2个月的.net经验让我不太喜欢MasterPage。如何使用这些属性创建子类(或扩展页面类?)呢?在页面的代码隐藏文件中,您可以告诉它使用“MyPage”而不是“System.Web.UI.Page”类,这将很容易地为您提供“MyPage”中的属性。如果您需要参考,请查阅继承的概念。class PageExtented:Page{///此处的属性…}我不太喜欢使用2个月.net经验的母版页。如何使用这些属性创建子类(或扩展页面类?)呢?在页面的代码隐藏文件中,您可以告诉它使用