2013-10-27 29 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; 
    } 
}