维护2个相似但不同的网站

时间:2013-05-02 08:52:25

标签: asp.net architecture

我有一个要求,我需要在2个域中托管同一个网站。 2之间的唯一区别是次要样式差异(基本上只是徽标和标题),站点将被托管,数据库的连接字符串(db结构将是相同的)。

我认为这与不同的stackexhange网站大致相似。

创建和维护此内容的最佳方法是什么?我想避免使用2个完全独立的解决方案,因为这将成为维护的噩梦。可能需要单独对这两个站点进行增强。

我的项目结构大致如下:

  • Web项目(asp.net网络表单)
  • 数据项目(EF用于数据访问)
  • 服务项目(用于从数据层返回数据并处理任何计算)

这就是我想的方式:

  • 在Web项目中具有将显示不同样式的逻辑 取决于从哪里访问。
  • 为具有不同连接字符串的2个域提供单独的服务类。这将意味着服务层中有很多重复的代码。
  • 使用依赖注入,我可以轻松更改将在部署时使用的服务类。

这样的东西

ASPX:

<% if(domain) { %>
   some html
<% } %>

aspx.cs:

 [Inject]
 public IService service { get; set; }

IService.cs:

public interface IService
    {
        string GetClients();
    }

Service.cs:

public class DomainAService: IService
{
 DbContext db = new DbContext("connectionStringA");
    public string GetClients()
    {
        return db.Clients.ToString();
    }
}

public class DomainBService: IService
{
DbContext db = new DbContext("connectionStringB");
    public string GetClients()
    {
        return db.Clients.ToString();
    }
}

这种架构有意义吗?服务层中的重复逻辑是一个问题吗? 我想知道堆栈交换站点是如何做到的。

2 个答案:

答案 0 :(得分:2)

您可以将配置详细信息作为应用程序设置放在web.config中。

因此连接字符串将位于web.config中。如果您需要不同的徽标,可以使用“徽标”应用程序设置。

服务层中的代码如下所示:

public class DomainService: IService
{
    var connectionString = ConfigurationManager.AppSettings["ConnString"];
    DbContext db = new DbContext(connectionString);

    public string GetClients()
    {
        return db.Clients.ToString();
    }
}

ConfigurationManager位于System.Configuration命名空间/程序集中。

因此,两个部署仅在web.config中有所不同。

如果连接字符串包含敏感的用户名/密码,则可以对设置进行编码 - 请参阅此问题Encrypting appSettings in web.config

答案 1 :(得分:1)

保持简单。一个网站解决方案,根据网址呈现不同的内容和样式。

我们使用master page和css来完成此操作。母版页:

<%-- override css --%>
<link id="overrideCSS" rel="stylesheet" href="" runat="server" />

在后面的代码中,以编程方式设置CSS文件,具体取决于所请求的域(例如,可以设置徽标)并呈现任何与url相关的字符串。同样,可以在单个页面加载方法中隐藏/显示/修改其他基础结构。

当你能做到这一点时,我没有看到需要单独的服务:

public class DomainService: IService
{
    public string GetClients()
    {
        string connectionStringForDomain = someFunctionWhichChecksUrlAndReturnsConnectionString();
        return new DbContext(connectionStringForDomain).Clients.ToString(); // btw, why convert to string? Can't the serialiser take care of this automatically?
    }
}

如果你需要不同的服务类,某种形式的依赖注入可能是最佳选择。我已经非常成功地在不同的Linq到Sql数据上下文中共享代码,例如,通过声明接口,在2 dcs上实现这些接口,并根据需要注入相关的dc。