[ASP.NET 设计模式] 用Visual Studio2010搭建一个简单的分层结构示例Step by Step —— 06 用户界面层
时间:2011-02-01 来源:李志鹏
转载请注明本文来自博客园 http://www.cnblogs.com/charrli
书中使用了StructureMap来实现依赖注入。StructureMap的地址为:http://sourceforge.net/projects/structuremap
structureMap的作用就是充当一个全局的对象的生成器,自动解决在对象生成过程中由于出现了接口找不到相应类的情况。
下面是用户界面层的实现方法:
1. 在solution的根目录下新建一个lib目录,将strucutremap.dll放入。然后在WebUI这个项目里添加引用。
2. 添加BootStrapper类:
public class BootStrapper
{
public static void ConfigureStructureMap()
{
ObjectFactory.Initialize(x =>
{
x.AddRegistry<ProductRegistry>();
});
}
}
public class ProductRegistry : Registry
{
public ProductRegistry()
{
ForRequestedType<IProductRepository>().TheDefaultIsConcreteType<ProductRepository>();
}
}
这个类的作用是,当生成Service.ProductService的时候,需要注入Model.ProductService,但是我们观察Model.ProductService的构造函数可以发现:
public ProductService(IProductRepository productRepository)
{
_productRepository = productRepository;
}
这里有对接口IProductRepository的依赖。由于接口实现了断耦,所以StructureMap不知道使用哪一个类对这个接口进行注入,因此,必须提前通过BootStrapper进行注册,表明遇到IProductRepository的时候,使用类ProductRepository进行注入。
3. 在Global.asax里提前执行该Dependency注册:
protected void Application_Start(object sender, EventArgs e)
{
BootStrapper.ConfigureStructureMap();
}
4. Default.aspx.cs:
public partial class _Default : System.Web.UI.Page, IProductListView
{
private ProductListPresenter _presenter;
protected void Page_Init(object sender, EventArgs e)
{
_presenter = new ProductListPresenter(this, ObjectFactory.GetInstance<Service.ProductService>());
this.ddlCustomerType.SelectedIndexChanged += delegate { _presenter.Display();};
}
protected void Page_Load(object sender, EventArgs e)
{
if (Page.IsPostBack != true)
_presenter.Display();
}
public void Display(IList<ProductViewModel> Products)
{
rptProducts.DataSource = Products;
rptProducts.DataBind();
}
public CustomerType CustomerType
{
get { return (CustomerType)Enum.ToObject(typeof(CustomerType), int.Parse(this.ddlCustomerType.SelectedValue) ); }
}
public string ErrorMessage
{
set { lblErrorMessage.Text = String.Format("<p><strong>Error</strong><br/>{0}<p/>", value); }
}
}
这是整个项目的最后环节。
1). 首先注意为这个class添加了一个IProductListView,这导致在这个类里面实现的Display方法,CustomerType和ErrorMessage,都可以被Presenter所调用。注意Presenter里面IProductList的定义:
public interface IProductListView
{
void Display(IList<ProductViewModel> Products);
Model.CustomerType CustomerType { get; }
string ErrorMessage { set; }
}
可见这个接口定义的Display方法和property在这个类里都具体实现了。
2). 其次观察Presenter和其下面的Service Layer是如何连接的。程序利用页面初始化,构造了WebUI下面这一层的Presenter的对象,构造过程中使用了Structure Map,直接生成Presenter构造函数需要的Model.ProductService对象。注意,页面本身也被传入了这个构造函数中,页面提供的一个方法两个属性,已经交由Presenter控制。
3)同时,Presenter的Display方法被委托到了DropDownList的SelectedIndexChanged事件上。至此我们可以整理出这个实例的控制逻辑:DropDownList选项改变 => SelectedIndexChanged触发 =>执行Presenter的Display方法 => 通过IProductListView接口执行页面的Display方法 –>页面的Display方法绑定了数据源,数据显示出来了。
[ASP.NET 设计模式] 用Visual Studio2010搭建一个简单的分层结构示例Step by Step —— 01 准备工作
http://www.cnblogs.com/charrli/archive/2011/01/31/1948483.html
[ASP.NET 设计模式] 用Visual Studio2010搭建一个简单的分层结构示例Step by Step —— 02 业务逻辑层
http://www.cnblogs.com/charrli/archive/2011/01/31/1948504.html
[ASP.NET 设计模式] 用Visual Studio2010搭建一个简单的分层结构示例Step by Step —— 03 服务层
http://www.cnblogs.com/charrli/archive/2011/02/01/1948521.html
[ASP.NET 设计模式] 用Visual Studio2010搭建一个简单的分层结构示例Step by Step —— 04 数据访问层
http://www.cnblogs.com/charrli/archive/2011/02/01/1948523.html
[ASP.NET 设计模式] 用Visual Studio2010搭建一个简单的分层结构示例Step by Step —— 05 表现层
http://www.cnblogs.com/charrli/archive/2011/02/01/1948554.html
[ASP.NET 设计模式] 用Visual Studio2010搭建一个简单的分层结构示例Step by Step —— 06 用户界面层
http://www.cnblogs.com/charrli/archive/2011/02/01/1948563.html