0

Я новичок с единством и единицей рабочего шаблона, и я пытаюсь написать код, который подключается к моему веб-сервису и выполняет всю работу. Все идет хорошо, пока я не использую базу данных, но я теряюсь, когда пытаюсь использовать веб-сервис.MVC3 - Unity/Unit of Work Образец и реализация Webservice

Я потратил впустую свои 2 драгоценных дня, исследуя каждую возможную статью, связанную с ней, и применяю ее к моему коду, но не удача до даты.

Я знаю, написав строку подключения в web.config и вызвав ее в контроллере класса dbcontext, подключится к требуемой базе данных, но я не подключаюсь к какой-либо базе данных, поэтому какие изменения мне нужно сделать в веб-приложении. конфигурации. Кроме того, даже если я пишу логику подключения в конструкторе dbcontext, он по-прежнему ищет и заполняет dbcontext данными сервера sql. Я предполагаю, что это происходит, потому что я использую 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); 
    } 
    } 

СЕРВИС

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

Sooo .... что именно вы хотите знать? – Steven

+0

@Steven: что я хочу знать, как я могу использовать webservice, потому что, если я использую dbset или dbcontext, я не получаю никакой ссылки на webservice, хотя я указываю его в конструкторе dbcontext. может быть, я не знаю, как закодировать его. пожалуйста помогите. – DotNetGeek

+0

Прошу прощения, но я до сих пор не понимаю ваш вопрос. DbContext - это абстракция над базами данных, а не через веб-службы. Если вы цель, используйте DbContext для связи с веб-сервисом, вы потерпите неудачу. Это невозможно. – Steven

ответ

0

Все дело в правильных абстракциях. Общей абстракцией, которая используется между некоторым источником данных (может быть db или ws), является шаблон репозитория или на более высоком уровне шаблона «Единица работы». На самом деле Entity Framework DbContext представляет собой реализацию шаблона Unit of Work, но он предназначен для баз данных. Вы не можете использовать связь с веб-службой.

В этом случае вам нужно будет написать свою собственную абстракцию IRepository<T> и иметь реализацию конкретной базы данных, которая использует обложки DbContext и специальную реализацию веб-службы, которая обертывает прокси-сервер клиента веб-службы под обложками.

Однако, когда ваше приложение становится более сложным, вы часто обнаруживаете, что хотите иметь какую-то транзакцию, такую ​​как поведение. Это то, что шаблон Единицы работы, если для: он представляет собой бизнес-транзакцию. Однако использование шаблона работы для нескольких вызовов 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 с поддержкой этой модели.

Смежные вопросы