您的位置:首页 > 移动开发 > Objective-C

Naked objects 起步(v6,v7)

2017-06-10 11:09 106 查看
Naked Objects 新手尝试这个简单的示例: 编写你的第一个 Naked Objects 应用程序。然后你就可以稍正式一点的内容。

Naked Objects应用程序通常由多个项目组成。

首先,通常有一个或多个 ‘Model’项目,用于存放领域类,参考:

创建领域模型项目

其次你需要一个或多个 ‘Run’ 项目。如果你准备创建用户界面,你就添加 MVC 项目。参考:

Naked Objects MVC应用程序项目上运行领域模型

过后你可能决定加个 Restful API,作为备选方案 ‘运行’ 领域模型:

创建并使用Restful Objects API

或者运行在独立的可执行程序程序上,批量操作的示例:

无用户界面运行

同样添加一个或多个测试项目。 可以是传统的单元测试,但我强烈推荐你考虑强大的 Naked Objects XAT 框架来编写界面无关的功能或测试:

可运行应用程序测试 (XATs)

如果你坚持使用 Naked Objects MVC 生成的用户界面 (基本不会有变化)则通常不需要编写界面测试。但如果是自定义的用户界面 (除只改动 CSS外) 你就要写界面测试了。 我们写了一些Selenium 框架的帮助类,参考:

使用 Selenium结束最终测试

编写第一个Naked Objects 应用程序

接下来的几个步骤用于编写第一个极简单的Naked Objects应用程序,功能上只有一个简单的领域类:

使用Visual Studio 2013 (Express 版本即可) 创建一个名称为MyWebApp的 ASP.NET Web Application 项目,使用 MVC 模板。

安装 NuGet 包 NakedObjects.Mvc-FileTemplates,选择 Yes To All 同意覆盖现有文件。

在Models文件里创建一个和下边一样的 Customer 类。注意:

Naked Objects 应用程序中的所有属性必须为 virtual。

[Hidden] 指出哪些属性不需要显示在界面上。

[Title] 指出哪属性的值显示Tab上。

using NakedObjects;

namespace MyWebApp
{
public class Customer
{
[Hidden]
public virtual int Id { get; set; }

[Title]
public virtual string Name { get; set; }
}
}


创建如下DbContext对象 (标准Entity Framework Code First 编码。)

using System.Data.Entity;

namespace MyWebApp
{
public class MyDbContext : DbContext
{
public DbSet<Customer> Customers { get; set; }
}
}


App_Start 目录中找到 RunWeb 类编辑如下两个成员。类与编辑的成员如下。首先, MenuServices 属性定义主菜单的显示服务。(NakedObjects.Services.SimpleRepository 是一个现有类只用于原有的协议。)

protected override IServicesInstaller MenuServices {
get {
return new ServicesInstaller(
new SimpleRepository<Customer>());
}
}


其次, 我们需要在DbContext(s) 中指出需要的持久属性:

protected override IObjectPersistorInstaller Persistor
{
get
{
var installer = new EntityPersistorInstaller();
installer.UsingCodeFirstContext(() => new MyDbContext());
return installer;
}
}


运行项目。使用Customers 菜单里的动作,尝试创建和返回Customer 对象。

创建领域模型项目

Naked Objects 使用微软的 Entity Framework 将领域对象持久化到数据库中。大部分使用Entity Framework开发者现在使用 ‘Code First’ 模式- 并且这一模式贯穿整个手册。命名略有偏题: ‘Code First’ 模式也可用在现有数据库上 – ‘Code First’ 只是意味着持久化完全定义在程序代码里 (通常为 C#)。 Naked Objects 在Entity Franework 旧模式式下也一样运行良好,即实体定义在 .edmx 结尾的xml文件里。

该手册并不试图提供 Entity Framework Code First 开发的介绍 - 而只是强调程序中与 Naked Objects 结合的部分。因此建议了解一下 Entity Framework Code First 开发:网上有许多教程,我们强烈推荐 Julia Lerman 和Rowan Millar写的书《Programming Entity Framework - Code First 》

考备在线教程示例中提到的领域代码时,要记住以下规则:

Naked Objects 要求所有的属性为 virtual。

Naked Objects 要求所有的集合为 virtual,并已初始化 (非构造函数)。见 集合属性

Entity Framework Code First 所有属性在数据库都是可空的,除非强行指定 (使用 Required 属性,或通过 Code First Fluent API)。然而Naked Objects framework对待用户界面 (Naked Objects MVC) 或 Restful API (.NETRestful 对象) 的属性都是要求有值的,除非标记了Optionally 属性 - 我们认为这种默认的行为更加安全。 Naked Objects 可以通过其它方式进行配置只要你想 (见 Optional vs. Required)。

定义模型项目

你的起始点是开发一个或多个模型项目,如下:

创建校报的 Class Library 项目。

打开 NuGet 包管理,找到
NakedObjects.ProgrammingModel
包并安装 (见下边 Naked Objects IDE部分)。

添加POCO领域类,接着用Naked Objects 框架组织简单的编程协议。 见 领域对象

创建Repositories/Factories之类的服务。

Naked Objects IDE

如果你通过 NuGet Package Manager安装NakedObjects.ProgrammingModel,NakedObjects.Ide 包会自动安装,这里边有一组模板项及代码片段来帮助你构建领域对象模型。棋牌项用于 Add > New Item:你在C#编程语言下边的 Naked Objects 里的列表里找到这些模板。查看代码片断列表: Tools > Code Snippets Manager > [Language] > My Code Snippets > Naked Objects。大部分都可以使用快捷方式,像 'propcho' 添加一个属性的 Choices 方法。不过,如安装其它工具像Resharper,这些快捷方式可能不起作用。IDE被替换成自有包因此有些项目中你可以选择卸载 NakedObjects.ProgrammingModel ,无论你是否想卸载 IDE,多个项目都可以用。

定义 DbContext

接下来你需要在项目中设置一个 'Context'类 ,项目定义和 Code First 开发协议一致。你可以使用 Naked Objects > DbContext 模板项帮助创建这个类 - 示例如下 :

namespace DataAccess
{
public class MyContext : DbContext
{
public MyContext(string name) : base(name) { }

public MyContext() { }

public DbSet<Foo> Foos { get; set; }

public DbSet<Bar> Bars { get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//Initialisation
//Use the Naked Objects > DbInitialiser template to add a custom initialiser, then reference thus:
Database.SetInitializer(new DropCreateDatabaseIfModelChanges<MyContext>());

//Mappings
//Use the Naked Objects > Mapping template to add mapping classes & reference them thus:
//modelBuilder.Configurations.Add(new Employee_Mapping());
}
}
}


这个上下文继承
System.Data.Entity.DbContext
类,其定义一些方法返回一个或多个
DbSet
s。

不必为每个领域类分别定义一个
DbSet
- 只要定义模型层次中根类。

OnModelCreating
方法中你可以这样:

用 Code First 'Fluent API'创建数据库映射。使用 Naked Objects > DbMapping 模板快速创建类。

添加数据库初始化确定何时/是否删除和重新架构。使用 Naked Objects > DbInitialiser 模板项快速创建初始化类。你可以用初始化器生成数据库,但你得考虑作为备选方案-使用 Naked Objects自有数据结构模式有许多优点。

重载默认数据库架构生成

默认情况下, Entity Framework Code First 创建数据库遵循基于类和属性名称的一组约定。这些基于约定的架构可能需要精简和提高,领域类里使用 Code First 数据注解,或使用 Code First Fluent API来解释也是一样。后者是创建一个或多个配置类来实现 (继承于
EntityTypeConfiguration<T>
) 并在
DbContext中引用,示例如下
(引用自Julia Lerman 和Rowan Millar的《Programming Entity Framework - Code First》):

namespace DataAccessFluent
{
public class DestinationConfiguration : EntityTypeConfiguration<Destination>
{
public DestinationConfiguration()
{

Property(d => d.Name).IsRequired();

Property(d => d.Description).HasMaxLength(500);

Property(d => d.Photo).HasColumnType("image");
}
}

namespace DataAccessFluent
{

public class DestinationConfiguration : EntityTypeConfiguration<Destination>
{

public DestinationConfiguration()
{

Property(d => d.Name).IsRequired();

Property(d => d.Description).HasMaxLength(500);

Property(d => d.Photo).HasColumnType("image");

}

}

public class LodgingConfiguration : EntityTypeConfiguration<Lodging>
{

public LodgingConfiguration()

{

Property(l => l.Name).IsRequired().HasMaxLength(200);

Property(l => l.Owner).IsUnicode(false);

Property(l => l.MilesFromNearestAirport).HasPrecision(8, 1);

}

}

//...

public class BreakAwayContextFluent : DbContext
{

public BreakAwayContextFluent(string name) : base(name) { }

public BreakAwayContextFluent() { }

public DbSet<Destination> Destinations { get; set; }

public DbSet<Lodging> Lodgings { get; set; }

//...

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{

modelBuilder.Configurations.Add(new DestinationConfiguration());
modelBuilder.Configurations.Add(new LodgingConfiguration());

// ...

}

}

}


数据设备和 Code First

使用Code First时,有个可选项用于创建数据组件 (预填充数据库) 即通过数据库初始化器的
Seed
方法。
示例如下
(引用自Julia Lerman 和Rowan Millar的《Programming Entity Framework - Code First》):

namespace DataAccess

{

public class DropCreateBreakAwayWithSeedData : DropCreateDatabaseAlways<BreakAwayContext>

{

protected override void Seed(BreakAwayContext context)

{

context.Destinations.Add(new Model.Destination {
Name = "Great Barrier Reef" });

context.Destinations.Add(new Model.Destination { Name = "Grand Canyon" });

//...

}

}

}


自定义数据库初始化器要设置运行类的
Persistor
属性,如前边的节里所述,或 DbContext的
OnModelCreating()
方法里设置。

另一可选方式是使用Naked Objects 自有的数据组件模式,其优点是你可以委托服务或对对象里的方法来创建,就得用户自己创建的一样。

作为Naked Objects MVC 应用程序运行领域模型

下边的步骤运行领域模型使用 Naked Objects MVC 用户界面。

创建一个新的C# ASP.NET Web Application 项目,,选择 MVC 模板,并设为启动项目。

打 Nuget 包管理器,找到
NakedObjects.Mvc-FileTemplates
包并安装。

添加模型项目的引用。

将模型项目中
App.config
文件里的连接字符串考备到运行项目的
Web.config
中。

标准MVC项目中有两个
web.config
文件 - 一个在 Views 文件夹里 (防止不经过控制器直接访问视图) 而另一个在项目根目录下。连接字符串后边会用到。

打开
RunWeb
类 (在
App_Start
目录里)。在这个运行类里,注册服务,组件 (有必要的话),及对默认运行配置进行必要的修改。

本地运行项目。运行后会在浏览器中打开程序中起始页面。

即使你选择 Internet 项目模板,默认情况下,应用程序初始设置里也不要求登录。当你往协议中添加验证时,只是简单把
GenericController
SystemController两类的
[Authorize]前边的注释去掉。


当你准备就绪,程序就可以布置到IIS上运行, ASP.NET MVC 也是一样。最简单的方式就是右击项目,点击发布。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: