2013-05-02 69 views
1

我有一個需求,我需要在2個域中託管相同的網站。 2之間的唯一區別是次要樣式差異(基本上只是徽標和標題),站點將駐留在何處以及數據庫的連接字符串(db結構將相同)。維護2個類似但不同的網站

我想這大概是與不同的stackexhange網站類似的要求。

什麼是創建和維護的最佳方式?我想避免有兩個完整的單獨解決方案,因爲這將成爲維護噩夢。有可能需要分別對兩個站點進行增強。

我的項目結構大致如下:

  • Web項目(asp.net web窗體)
  • 數據項目(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(); 
    } 
} 

此架構是否有意義?服務層中的重複邏輯是否有問題? 我不知道堆棧交換站點是如何做到的。

回答

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。

+0

感謝您的回答...是啊,我越去想它不太我認爲有必要,除非有具體有在業務規則嚴重分歧單獨的服務類(即使到那時,可能是簡單的保留一個服務,檢查你所在的領域,就像你的例子)。 ToString只是爲了這個例子。 – woggles 2013-05-02 11:23:20

+0

不客氣,謝謝你的回覆,祝你好運。 – 2013-05-02 12:44:16

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