将任何UI连接到我的应用程序

时间:2011-10-30 22:57:31

标签: asp.net n-tier-architecture

目前,我已经非常成功地构建了我的应用程序,如下所示:

  • 数据模型(实体框架4.1)

  • 使用Enterprise Library 5.0验证应用程序块进行验证。

  • 由可重用的类库管理的对象上下文。

因此,UI在代码上非常清晰但我知道我还没完全在那里。

如果我想设置我的项目以便实现Web窗体,MVC,WPF桌面或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();
        }
    }
}

Web App用户界面

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 个答案:

答案 0 :(得分:3)

公开中间/后端以便各种客户端可以挂钩的最简单方法是将其全部包装在一个或多个Web服务中。在您的示例中,您可以考虑将MyEntityFacade公开为WCF服务,或者您可以构建一个在客户端和外观之间来回传递的全新层。

如果您坚持使用POCO对象和SOAP,除了列出的客户端之外,您可以考虑从java,javascript,python等连接。