1

我需要为现有的 MVC 应用程序提供一个全新的界面。很多是一样的,很多是不同的。我已经想到了四种方法来做到这一点,但我真的不喜欢其中任何一种。

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

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

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

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

  4. 部分视图:一个应用程序,一个区域。我们在视图中放置条件检查来决定渲染哪个部分(客户部分或员工部分)。

更多细节

我们在业务中使用可运行的 MVC 3 应用程序来满足我们所有的办公室管理需求。它包括员工时间、采购订单、客户管理和历史记录等功能。那里有大量客户信息,我们的客户希望看到他们的购买历史记录、关于他们花费了多少的报告等。我们显然没有只想向他们开放我们的系统。它有很多我们不希望他们看到的内部数据,我们也不希望他们能够修改任何东西。

4

1 回答 1

0

你为什么不把你的解决方案分成不同的项目呢?

我喜欢使用代理模式。

在我的解决方案中,我有三个项目:

  • MVC(引用了代理项目)
  • 代理(它是一个类库,持有对 WCF 项目的引用)
  • WCF(这个项目懂数据库,我的Entity Framework在这里)

我想这张图片可能会有所帮助:

在此处输入图像描述

使用这种方法,您可以在代理项目中拥有不同的存储库,您可以在它们之间进行交换。当我们进行单元测试或需要使用缓存的存储库时,它非常有用。

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;
    }
}   
于 2013-10-27T11:09:14.060 回答