c#站点所有页面上使用的变量所需的想法

c#站点所有页面上使用的变量所需的想法,c#,caching,C#,Caching,我有一个网站,提供伪子域为基础的网站。每个子域都有一组我需要在所有页面上访问的设置(即字符串名称、字符串css、字符串标题)。为了便于访问,最好的存储方式是什么 我无法使用webconfig,因为不同的子域有自己的设置集合,所以我将设置存储在sql server上。我想用不同的缓存名称缓存所有设置,但我担心内存占用。不管如何使用缓存,我知道我需要编写某种类型的类,将每个设置作为属性公开 有什么想法吗?为什么不对页面或母版页进行子类化,然后公开您的属性 在一个C#文件中 在所有的ASPX文件中 &

我有一个网站,提供伪子域为基础的网站。每个子域都有一组我需要在所有页面上访问的设置(即字符串名称、字符串css、字符串标题)。为了便于访问,最好的存储方式是什么

我无法使用webconfig,因为不同的子域有自己的设置集合,所以我将设置存储在sql server上。我想用不同的缓存名称缓存所有设置,但我担心内存占用。不管如何使用缓存,我知道我需要编写某种类型的类,将每个设置作为属性公开


有什么想法吗?

为什么不对
页面
母版页
进行子类化,然后公开您的属性

在一个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经验的母版页。如何使用这些属性创建子类(或扩展页面类?)呢?在页面的代码隐藏文件中,您可以告诉它使用