日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

偶得--Unity在asp.net mvc上的基本应用

發(fā)布時(shí)間:2025/7/14 asp.net 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 偶得--Unity在asp.net mvc上的基本应用 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

最近在研究Oxite,發(fā)現(xiàn)在這個(gè)程序中,大量采用了Unity這個(gè)微軟的IOC框架。過(guò)去我對(duì)于IOC的了解,還只停留在“城堡”階段。所以最近對(duì)Unity這個(gè)框架進(jìn)行了下小小的補(bǔ)課,現(xiàn)在就將一個(gè)簡(jiǎn)單的應(yīng)用拿出來(lái)跟大家分享。

首先,我有個(gè)主頁(yè)HOME

?

public class HomeController : Controller

在它下面有個(gè)Index,在這個(gè)頁(yè)面上有個(gè)主頁(yè)信息,需要從數(shù)據(jù)庫(kù)上獲取,我們首先先創(chuàng)建一個(gè)獲取這個(gè)信息的接口

??? public interface IGetHomeInfo
??? {
??????? string GetHomeTitle();
??? }

然后,實(shí)現(xiàn)它的一種方式

?

??? public class GetHome : IGetHomeInfo
??? {

??????? #region IGetHomeInfo 成員

??????? public string GetHomeTitle()
??????? {
??????????? DataService ds = new DataService();
??????????? return ds.GetHomeTitle();
??????? }

??????? #endregion
??? }

然后,我們先在index頁(yè)面的Controller中,加入這個(gè)接口

?

??? public class HomeController : Controller
??? {

??????? [Dependency]
??????? public IGetHomeInfo getHomeTitle { get; set; }

?

??????? [LoggerFilter()]
??????? [ExceptionFilter()]
??????? public ActionResult Index(int? id)
??????? {
??????????? DataService ds = new DataService();
??????????? ViewData["HomeTitle"] = getHomeTitle.GetHomeTitle();
??????????? ViewData["Id"] = id.ToString();
??????????? return View();
??????? }

好了,現(xiàn)在我們?cè)贗ndex(int? id)中放入了一個(gè)IGetHomeInfo 類(lèi)型的注入接口,下面我們就把GetHome 注入到這個(gè)位置

??? public interface IContainerAccessor
??? {
??????? IUnityContainer Container { get; }
??? }

?

?

public class MvcApplication : System.Web.HttpApplication, IContainerAccessor

??? {
??????? private static UnityContainer _container;

??????? public static IUnityContainer Container
??????? {
??????????? get { return _container; }
??????? }

?

??????? IUnityContainer IContainerAccessor.Container
??????? {
??????????? get { return Container; }
??????? }


??????? public static void RegisterRoutes(RouteCollection routes)
??????? {
??????????? routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

??????????? routes.MapRoute(
??????????????? "Default",????????????????????????????????????????????? // Route name
??????????????? "{controller}/{action}/{id}",?????????????????????????? // URL with parameters
??????????????? new { controller = "Test", action = "Index", id = "" }? // Parameter defaults
??????????? );

????????

??????? }

??????? protected void Application_Start()
??????? {
??????????? AreaRegistration.RegisterAllAreas();

??????????? RegisterRoutes(RouteTable.Routes);

??????????? if (_container == null)
??????????????? _container = new UnityContainer();

??????????? IControllerFactory controllerFactory =
??????????????? new UnityControllerFactory(_container);

??????????? ControllerBuilder.Current.SetControllerFactory(controllerFactory);

??????????? _container.RegisterType<IGetHomeInfo, GetHome>????//在這里完成了具體的接口-類(lèi)型綁定
??????????????? (new ContainerControlledLifetimeManager());

    _container.RegisterType<IActionInvoker, BYSJControllerActionInvoker>();
??????? }
??? }

最后,我們還需要完成UnityControllerFactory它繼承自DefaultControllerFactory,代碼如下:

?

public class UnityControllerFactory : DefaultControllerFactory
??? {
??????? IUnityContainer _container;

??????? public UnityControllerFactory(IUnityContainer container)
??????? {
??????????? _container = container;
??????? }

??????? protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext,Type controllerType)
??????? {
??????????? if (controllerType == null)
??????????????? throw new ArgumentNullException("controllerType");

??????????? if (!typeof(IController).IsAssignableFrom(controllerType))
??????????????? throw new ArgumentException(string.Format(
??????????????????? "Type requested is not a controller: {0}", controllerType.Name),
??????????????????? "controllerType");

??????????? IController ic? = _container.Resolve(controllerType) as IController;
??????????? if (typeof(Controller).IsAssignableFrom(controllerType))
??????????? {
??????????????? Controller controller = ic as Controller;

??????????????? if (controller != null)
??????????????????? controller.ActionInvoker = _container.Resolve<IActionInvoker>();

??????????????? return ic;
??????????? }

??????????? return ic;
??????? }
??? }

?

這樣,一個(gè)簡(jiǎn)單的IOC注入就完成了,至于程序中的IActionInvoker是怎么回事,我們留到下回再說(shuō)

?

轉(zhuǎn)載于:https://www.cnblogs.com/yriyr/archive/2010/01/31/1660638.html

總結(jié)

以上是生活随笔為你收集整理的偶得--Unity在asp.net mvc上的基本应用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。