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



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

我想这与不同的stackexchange网站大致相同。

创建和维护它的最佳方法是什么?我希望避免有两个完全独立的解决方案,因为这将成为维护的噩梦。这两个站点有可能需要分别进行增强。

我的项目结构大致如下:

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

我是这么想的:

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

比如

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();
    }
}

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

你可以把配置细节放到网上。配置为应用程序设置

因此连接字符串将在web.config中。当你需要一个不同的标志时,你可以有一个"logo"应用程序设置。

服务层中的代码看起来像这样:

public class DomainService: IService
{
    var connectionString = ConfigurationManager.AppSettings["ConnString"];
    DbContext db = new DbContext(connectionString);
    public string GetClients()
    {
        return db.Clients.ToString();
    }
}

ConfigurationManager在系统中。配置命名空间/程序集。

所以这两个部署只是在web.config中有所不同。

如果连接字符串包含敏感的用户名/密码,那么您可以对设置进行编码-参见这个问题在web.config中加密应用设置。

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

我们通过使用母版页和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 to Sql数据上下文共享代码方面取得了巨大的成功,例如,通过声明接口,在2个dc上实现这些接口,并根据需要注入相关的dc。

最新更新