Подключение любого интерфейса к моему приложению
В настоящее время я очень успешно разработал свои приложения следующим образом:
Модель данных (Entity Framework 4.1)
Валидация с использованием бланка приложения валидации Enterprise Library 5.0.
Контекст объекта управляется повторно используемой библиотекой классов.
Итак, пользовательский интерфейс довольно легок в коде, но я знаю, что я еще не совсем там.
Если бы я хотел, чтобы мои проекты были настроены таким образом, чтобы я мог реализовать приложение Web Forms, MVC, WPF Desktop или Silverlight - даже Windows Phone 7 - какие дополнительные шаги мне могут потребоваться?
Вот некоторый код, преднамеренно упрощенный, чтобы проиллюстрировать мое текущее состояние игры (я пропустил контракты кода и библиотеки классов):
(В настоящее время EF4 Model First и ASP .Net Web Forms)
Частичный класс для автоматически сгенерированного объекта
namespace MyNamespace.Database
{
using Microsoft.Practices.EnterpriseLibrary.Validation;
using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;
[HasSelfValidation]
public partial class MyEntity : IMyEntity
{
[SelfValidation]
public void Validate(ValidationResults validationResults)
{
// Custom validation can go here, just add a new ValidationResult
// to validationResults if the rule fails.
if (validationResults != null)
{
validationResults.AddAllResults(
ValidationFactory
.CreateValidator<IMyEntity>()
.Validate(this));
}
}
}
}
Проверка
namespace MyNamespace.Database
{
using System.ComponentModel.DataAnnotations;
using System.Diagnostics.Contracts;
using Microsoft.Practices.EnterpriseLibrary.Validation;
using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;
[ContractClass(typeof(MyEntityContract))]
public interface IMyEntity
{
int Id
{
get;
set;
}
[Required]
[NotNullValidator]
[StringLengthValidator(0, RangeBoundaryType.Ignore, 50,
RangeBoundaryType.Inclusive,
MessageTemplate = "MyEntity Name must be 50 characters or less.")]
string Name
{
get;
set;
}
void Validate(ValidationResults validationResults);
}
}
Фасад для доступа к данным
namespace MyNamespace.Facade
{
using System.Collections.Generic;
using System.Linq;
using Common.ObjectContextManagement;
using Database;
public sealed class MyEntityFacade : FacadeBase<MyEntities, MyEntity>
{
public IEnumerable<MyEntity> GetAll()
{
return this.ObjectContext.MyEntitys
.Distinct()
.ToList();
}
}
}
Пользовательский интерфейс веб-приложения
using (new UnitOfWorkScope(false))
{
this.MyEntityList.DataSource = new MyEntityFacade().GetAll();
this.MyEntityList.DataBind();
}
// Or...
using (var scope = new UnitOfWorkScope(false))
{
var myEntityFacade = new MyEntityFacade();
var myEntity = new MyEntity();
PopulateEntity(myEntity);
// Validation errors are automatically presented
// to the user from the Validate method
if (Validate(myEntity))
{
try
{
myEntityFacade.Add(myEntity);
scope.SaveAllChanges();
}
catch (Exception exception)
{
Logging.Write("Error", LoggingLevel.Error, exception.Message);
}
}
}
Как близко я?
1 ответ
Самый простой способ раскрыть свой средний / бэкэнд, так что различные клиенты могут подключиться, - это обернуть все это в один или несколько веб-сервисов. В вашем примере вы можете рассмотреть возможность предоставления MyEntityFacade в качестве службы WCF или создать совершенно новый уровень, который будет проходить между вашими клиентами и фасадом.
Если вы придерживаетесь объектов POCO и SOAP, вы, вероятно, можете учитывать возможности подключения из java, javascript, python и т. Д. В дополнение к перечисленным клиентам.