2013-10-27 41 views
0

我需要爲現有的MVC應用程序提供全新的界面。很多都是一樣的,很多都會有所不同。我已經想到了四種方法來做到這一點,但我並不喜歡它們。如何劃分MVC應用程序

有人可以爲選擇一個選項提供良好的基礎嗎?

  1. 兩個應用程序:我們創建了一個全新的MVC應用程序,新的域(或子域),新的一切。我們可能會使用相同的數據訪問庫,但就Web界面而言,它們是完全獨立的。

  2. MVC領域:我們使用相同的應用程序,但創建員工區和客戶區域。我們使用某種基於角色的路由來決定請求屬於哪個區域。

  3. 有條件的控制器語句:我們檢查每個控制器方法內的請求並決定返回哪些數據。

  4. 部分視圖:一個應用程序,一個區域。我們在視圖內部進行條件檢查,以決定要呈現哪個部分(客戶或員工)。

更多詳細信息

我們用我們的業務工作MVC 3應用程序爲所有的我們的辦公室管理需求。它包括員工時間,採購訂單,客戶管理和歷史記錄等功能。在那裏有大量的客戶信息,我們的客戶喜歡看到他們的購買歷史,他們花了多少錢等等的報告。我們顯然不只想打開我們的系統。它有很多我們不希望他們看到的內部數據,我們不希望他們能夠修改任何內容。

回答

0

你爲什麼不把你的解決方案分成不同的項目?

我喜歡使用代理模式。

在我的解決方案我有三個項目:

  • MVC(有代理項目的引用)
  • 代理(這是一個類庫,持有是一個引用到WCF項目)
  • WCF (該項目知道數據庫,我的實體框架是在這裏)

我想這個形象可能會有所幫助:

enter image description here

使用這種方法,您可以在代理項目中擁有不同的存儲庫,您可以在它們之間進行交換。當我們進行單元測試時,或者當我們需要使用緩存存儲庫時,這非常有用。

public abstract class Repository<T> 
{ 
    public abstract T GetById(int id); 
} 

使用這一個單元測試

public class CustomerRepository : Repository<CustomerEntity> 
{ 
    public override CustomerEntity GetById(int id) 
    { 
     return new CustomerEntity() 
        { 
         Id = id, 
         Name = "Customer " + id 
        }; 
    } 
} 

用這個當你需要訪問外部服務

public class RemoteOrderRepository : Repository<OrderEntity> 
{ 
    public override OrderEntity GetById(int id) 
    { 
     // You can access your external service here 
    } 
} 

用這個把緩存的優勢

public class CachedOrderRepository : RemoteOrderRepository 
{ 
    public override OrderEntity GetById(int id) 
    { 
     string cacheKey = "Order" + id; 
     var entity = MemoryCache.Default[cacheKey] as OrderEntity; 
     if(entity == null) 
     { 
      entity = base.GetById(id); 
      var cacheItem = new CacheItem(cacheKey, entity); 
      var policy = new CacheItemPolicy(); 
      MemoryCache.Default.Add(cacheItem, policy); 
     } 
     return entity; 
    } 
}