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

时间:2013-04-19 16:32:41

标签: asp.net-mvc-3 web-services dependency-injection unity-container unit-of-work

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

我浪费了我宝贵的两天,搜索与它相关的每一篇可能的文章并将其应用到我的代码中,但直到约会都没有运气。

我知道,通过将连接字符串写入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
    }
 }

GENERIC REPOSITORY

   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);
    }
  }

SERVICE

 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();
    }
}    

CONTROLLER

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

1 个答案:

答案 0 :(得分:0)

这一切都与正确的抽象有关。在某些数据源(可能是db或ws)之间使用的公共抽象是存储库模式,或者在更高级别的工作单元模式。实际上,实体框架DbContext是工作单元模式的实现,但它是为数据库量身定制的。您无法使用与Web服务进行通信。

在这种情况下,您将必须编写自己的IRepository<T>抽象,并拥有一个使用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 detailThis article构建于该模型之上,并描述了如何使用此模型编写高度可维护的WCF服务。