MVC3 - Unity/工作单元模式和 Web 服务实现

Posted

技术标签:

【中文标题】MVC3 - Unity/工作单元模式和 Web 服务实现【英文标题】:MVC3 - Unity/Unit of Work Pattern and Webservice implementation 【发布时间】:2013-04-19 16:32:40 【问题描述】:

我是统一和工作单元模式的新手,我正在尝试编写一个代码,它连接到我的网络服务并完成所有工作。 在我使用数据库之前一切都很好,但是当我尝试使用网络服务时我迷路了。

我浪费了我宝贵的 2 天,搜索了所有可能与之相关的文章并将其应用到我的代码中,但到目前为止还没有运气。

我知道,通过将连接字符串写入 web.config 并在 dbcontext 类控制器中调用它,将连接到所需的数据库,但我没有连接到任何数据库,所以我需要在 web/app.config 中进行哪些更改.此外,即使我在 dbcontext 构造函数中编写连接逻辑,它仍然会搜索并使用 sql server 详细信息填充 dbcontext。我认为这是因为我正在使用 DBSet。

伙计们,请你看一下我的代码,我已经完成了,并向我展示了我能做到的希望。如果您想了解与您想查看的代码相关的任何其他信息,请告诉我。

谢谢

 DBCONTEXT

 public class CVSContext :  DbContext
 
    public DbSet<CVSViewModel> CVS  get; set; 
    public DbSet<Contact> Contacts  get; set; 
    public DbSet<Account> Accounts  get; set; 

    public CVSContext()
    
        //CRM Start
            var clientCredentials = new System.ServiceModel.Description.ClientCredentials();
            clientCredentials.UserName.UserName = "";
            clientCredentials.UserName.Password = "";
            var serviceProxy = new Microsoft.Xrm.Sdk.Client.OrganizationServiceProxy(new Uri("http://Organization.svc"), null, clientCredentials, null);
            serviceProxy.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new ProxyTypesBehavior());
            HttpContext.Current.Session.Add("ServiceProxy", serviceProxy);
          //CRM End
    
 

通用存储库

   public class GenericRepository<TEntity> where TEntity : class
   
    internal CVSContext context;
    internal DbSet<TEntity> dbSet;

    public GenericRepository(CVSContext context)
    
        this.context = context;
        this.dbSet = context.Set<TEntity>();
    
   

工作单位

   public interface IUnitOfWork : IDisposable

    int SaveChanges();


public interface IDALContext : IUnitOfWork

    ICVSRepository CVS  get; set; 

    IContactRepository Contacts  get; set; 

    //IAccountRepository Accounts  get; set; 


public class DALContext : IDALContext

    private CVSContext dbContext;
    private ICVSRepository cvs;
    private IContactRepository contacts;
   // private IAccountRepository accounts;

    public DALContext()
    
        dbContext = new CVSContext();
    

    public ICVSRepository CVS
    
        get
        
            if (cvs == null)
                cvs = new CVSRepository(dbContext);
            return cvs;
        

        set
        
            if (cvs == value)
                cvs = value;
        
    

    public IContactRepository Contacts
    
        get
        
            if (contacts == null)
                contacts = new ContactRepository(dbContext);
            return contacts;
        

        set
        
            if (contacts == value)
                contacts = value;
        
    

    public int SaveChanges()
    
        return this.SaveChanges();
    

    public void Dispose()
    
        if(contacts != null)
            contacts.Dispose();
        //if(accounts != null)
        //    accounts.Dispose();
        if(dbContext != null)
            dbContext.Dispose();

        GC.SuppressFinalize(this);
    
  

服务

 public interface ICVSService

    Contact CreateContact(Guid contactName, string productName, int price);

    List<CVSViewModel> GetCVS();
    List<Contact> GetContacts();
    List<Account> GetAccounts();


public class CVSService : ICVSService, IDisposable

    private IDALContext context;

    public CVSService(IDALContext dal)
    
        context = dal;
    

    public List<CVSViewModel> GetCVS()
    
        return context.CVS.All().ToList();
    

    public List<Contact> GetContacts()
    
        return context.Contacts.All().ToList();
    

    public List<Account> GetAccounts()
    
        return context.Accounts.All().ToList();
    

    public Contact CreateContact(Guid contactName, string accountName, int price)
    
        var contact = new Contact()  ContactId = contactName ;

        var account = new Account()  ContactName = accountName,  Rent  = price, Contact = contact ;

        //context.Contacts.Create(contact);
        context.SaveChanges();

        return contact;
    

    public void Dispose()
    
        if (context != null)
            context.Dispose();
    
    

控制器

  public ActionResult Index()
             
        ViewData.Model = service.GetContacts();
        return View();
    

【问题讨论】:

Sooo.... 你到底想知道什么? @Steven:我想知道的是,我如何使用 web 服务,因为如果我使用 dbset 或 dbcontext,我没有得到对 web 服务的任何引用,尽管我在 dbcontext 构造函数中指定了它.可能我不知道,如何编码。请帮帮我。 对不起,我还是不明白你的问题。 DbContext 是对数据库的抽象,而不是对 Web 服务的抽象。如果您的目标是使用 DbContext 与 Web 服务进行通信,那么您将失败。这是不可能的。 @Steven:让我换个说法。我想调用 web 服务,我将如何做或者我需要遵循什么方法,如果你说 dbcontext 是对 db 和 ws 的抽象,那么我会做哪些改变来用与 web 服务相关的东西替换现有的 dbcontext。让我知道,如果这让你清楚。谢谢 【参考方案1】:

这都是关于适当的抽象。在某些数据源(可能是 db 或 ws)之间使用的通用抽象是存储库模式,或者更高级别的工作单元模式。事实上,Entity Framework DbContext 是工作单元模式的一个实现,但它是为数据库量身定制的。您不能用于与 Web 服务通信。

在这种情况下,您将不得不编写自己的 IRepository&lt;T&gt; 抽象,并拥有一个使用 DbContext 底层的数据库特定实现和一个在底层封装 Web 服务客户端代理的 Web 服务特定实现。

但是,当您的应用程序变得更加复杂时,您经常会发现自己想要某种类似事务的行为。这就是工作单元模式的用途:它呈现一个业务事务。然而,使用工作单元模式来包装多个 WS 调用很快就会变得很痛苦。要做到正确需要做很多工作,在这种情况下,使用基于消息的架构会更好。

使用基于消息的架构,您可以将单个原子操作(业务事务或用例)定义为特定消息,例如:

public class MoveCustomerCommand

    public int CustomerId  get; set; 

    public Address NewAddress  get; set; 

这只是一个具有一组属性的对象 (DTO),但没有行为。很好的是,您可以使用 WCF 或任何其他技术通过网络传递这些类型的对象,或者在本地处理它们,而无需消费者知道。

看看this article that describes it in detail。 This article 建立在该模型之上,并描述了如何使用该模型编写高度可维护的 WCF 服务。

【讨论】:

以上是关于MVC3 - Unity/工作单元模式和 Web 服务实现的主要内容,如果未能解决你的问题,请参考以下文章

MVC2,MVC3,MVC4和MVC5的不同

Unity 中的单例每个调用上下文(Web 请求)

为啥在 MVC 3 中使用 ajax 动态加载表只能在兼容模式下工作?

通用存储库、工作单元、Unity 的架构问题

ASP.Net MVC 4 Web API 控制器不适用于 Unity.WebApi

MVC 3 - 控制器和视图模型 - 哪个应该包含大部分业务逻辑?