Я объясню вам, как пользоваться Службами, потому что они являются обязательными в архитектуре с 3 усталостями и отделяют модель от представления, как ничто другое.
Вы можете использовать два разных решения.
1.WCF DataServices.
Добавить -> Новый элемент -> Wcf Data Service.
Затем укажите имя DataContext и установите права доступа.
public class WcfDataService1 : DataService<TestEntities>
{
public static void InitializeService(DataServiceConfiguration config)
{
config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
config.SetEntitySetAccessRule("*", EntitySetRights.All);
config.SetServiceOperationAccessRule("*", ServiceOperationRights.AllRead);
}
/// <summary>
/// Example of custom operations
/// </summary>
[WebGet]
public IQueryable<Item> ItemsById(int id)
{
return this.CurrentDataSource.Items.Where(i => i.Id == id);
}
}
В клиентском приложении добавьте новую ссылку на службу, и после этого вы сможете использовать службу, как если бы она была локальной базой данных:
var proxy = new TestEntities(new Uri("http://localhost:8513/WcfDataService1.svc/"));
var items = proxy.Items.Where(i => i.Id > 2 && i.Title.Contains("x1"));
var item2 = proxy.Execute<Item>(new Uri("ItemsById?Id=1", UriKind.Relative)).FirstOrDefault();
Преимущество: вам не нужно писать многочисленные методы, такие как GetItemsById, GetItemsByYear, GetTenItems и т.д .;Вы можете создать фильтр запроса на стороне клиента.
Недостатки: операции сервиса не статически типизированы;трудно вызывать пользовательские операции, особенно если у них много параметров;Есть много проблем, если использовать пользовательские объекты вместо сущностей;
2.Службы WCF
Добавить -> Новый элемент -> Служба Wcf
Класс хранилища:
public class IssuesRepository
{
public static List<Issue> GetIssues()
{
//creating a new connection will not cause overhead because there is a pool of connections
using (var db = new TestEntities())
{
List<Expression<Func<Issue, bool>>> filters = new List<Expression<Func<Issue, bool>>>();
filers.Add(i => i.IssIsPending == showPendingTasks);
if (includeClosedIssues == false)
filers.Add(i => i.IssIsClosed == false);
if (showTasks == false)
filers.Add(i => i.IssIsOnStatusBoard == true);
IQueryable<Issue> issuesQuery = db.Items.AsQueryable();
foreach (var filter in filters)
issuesQuery = issuesQuery.Where(filter);
issuesQuery = from i in issuesQuery
orderby i.IssIsSticky descending, !i.IssDueDate.HasValue ascending, i.IssDueDate, i.IssUrgency
select i;
return issuesQuery.ToList(); //it will be serialized in any case
}
}
}
Служба:
public class Service1 : IService1
{
public List<Issue> GetIssues()
{
return IssuesRepository.GetIssues();
}
}
Преимущества: независимо от протокола;обеспечить сеансы, безопасность, транзакции.
Итак, в заключение я рекомендую использовать DataServices, если вам нужна только функциональность CRUD, и общие службы WCF, если вы используете набор операций со сложной логикой.