【发布时间】: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。让我知道,如果这让你清楚。谢谢
标签: asp.net-mvc-3 web-services dependency-injection unity-container unit-of-work