在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
谈到IoC和ASP.NET的集成,很多人会先后想到Ninject,不过我们个人还是倾向于Unity。这篇文章简单地介绍如果创建基于Unity的ControllerFactory。如下面的代码所示,我们通过直接继承DefaultControllerFactory创建一个自定的UnityControllerFactory。构造函数指定的是配置的UnityContainer的名称,如果没有显式指定则采用默认的UnityContainer。在重写的GetControllerInstance方法中,直接调用IUnityContainer的Resolve方法根据Controller类型创建相应的对象。[源代码从这里下载] class UnityControllerFactory: DefaultControllerFactory
2: {
private set; }
)
5: {
new UnityContainer();
as UnityConfigurationSection;
string.IsNullOrEmpty(containerName))
9: {
);
11: }
12:
string.IsNullOrEmpty(containerName))
14: {
15: configSection.Configure(container);
16: }
else
18: {
19: configSection.Configure(container, containerName);
20: }
this.Container = container;
22: }
override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
24: {
);
this.Container.Resolve(controllerType);
27: }
28: }
为了演示DefaultControllerFactory的作用,我们来创建一个简单的例子。假设我们要创建一个维护联系人的应用,我们通过具有如下定义的Contact类型表示联系人,而IContactRepository接口定义了一个从存储中获取所有联系人的GetAllContacts方法,DefaultContactRepository是对IContactRepository接口的实现。 class Contact
2: {
string Name { get; set; }
string Gender { get; set; }
string Address { get; set; }
6: }
7:
interface IContactRepository
9: {
10: IEnumerable<Contact> GetAllContacts();
11: }
12:
class DefaultContactRepository : IContactRepository
14: {
public IEnumerable<Contact> GetAllContacts()
16: {
new Contact
18: {
,
,
22: };
23:
new Contact
25: {
,
,
29: };
30: }
31: }
我们在Web应用的主页显示联系人列表,为此我创建了如下一个HomeController。在这里我们演示的是构造器注入,所以我们通过构造函数指定的IContactRepository对象来初始化Repository属性。在Action方法Index中调用IContactRepository的GetAllContacts方法为对应的View指定Model。 class HomeController : Controller
2: {
private set; }
public HomeController(IContactRepository repository)
5: {
this.Repository = repository;
7: }
public ActionResult Index()
9: {
this.Repository.GetAllContacts());
11: }
12: }
Index.cshtml代码如下所示,这是一个Model类型为IEnumerable<Contact>的View,它将所有的联系人信息列出来。 >
2: @{
自定义的UnityContainerFactory的注册定义在Gloable.asax中。初次之外,额外需要做的是忽略掉针对favicon.ico的路由,否则程序运行将会失败。 class MvcApplication : System.Web.HttpApplication
2: {
void RegisterGlobalFilters(GlobalFilterCollection filters)
4: {
new HandleErrorAttribute());
6: }
7:
void RegisterRoutes(RouteCollection routes)
9: {
);
);
,
, id = UrlParameter.Optional }
14: );
15: }
16:
void Application_Start()
18: {
19: AreaRegistration.RegisterAllAreas();
20: RegisterGlobalFilters(GlobalFilters.Filters);
21: RegisterRoutes(RouteTable.Routes);
22:
new UnityControllerFactory());
24: }
25: }
接口IContactRepository和DefualtContactRepository之间的映射关系定义在如下所示的<unity>配置中。 >
/>
/>
>
/>
>
>
通过浏览器访问Web应用的主页,将会得到如下所示的联系人列表。 |
请发表评论