如何划分MVC应用程序

时间:2013-10-27 10:14:16

标签: asp.net-mvc code-organization asp.net-mvc-areas

我需要为现有的MVC应用程序提供全新的界面。很多都是一样的,很多都会有所不同。我已经想到了四种方法,但我真的不喜欢它们。

有人可以为选择一个选项提供良好的基础吗?

  1. 两个应用程序:我们创建了一个全新的MVC应用程序,新域(或子域),新的一切。我们可能使用相同的数据访问库,但就Web界面而言,它们是完全独立的。

  2. MVC领域:我们使用相同的应用程序,但创建员工区域和客户区域。我们使用某种类型的基于角色的路由来决定请求属于哪个区域。

  3. 条件控制器语句:我们检查每个控制器方法中的请求,并决定要返回的数据。

  4. 部分视图:一个应用,一个区域。我们在视图中放置了条件检查来决定要呈现的部分(客户1或员工1)。

  5. 更多详情

    我们在业务中使用一个有效的MVC 3应用程序来满足我们的所有办公室管理需求。它包括员工时间,采购订单,客户管理和历史等功能。我们的客户很乐意看到他们的购买历史,报告他们花了多少钱,等等。我们显然不会想要打开我们的系统。它有很多我们不希望他们看到的内部数据,我们不希望他们能够修改任何内容。

1 个答案:

答案 0 :(得分: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;
    }
}