2009年10月21日 星期三

Unity 學習筆記 in Asp.Net MVC

1.Container.Resolve(Type t)
Resolve an instance of the default requested type from the container.
會將所指定的 class 產生一個 instance 並且將 Constructor 中的 parameter 注入

        container.Resolve(typeof(HomeController))

        public HomeController(Service service, Service2 service2)
        {
            this.service = service;
            this.service2 = service2;
        }

container 會將 Service 及 Service2 注入到 HomeController 中
但有個地方值得注意的。就是如果 HomeController 的 Constructor parameter 的 type 是 interface 時,就必需要注冊
            container.RegisterType<IService, Service>();

否則會有錯誤產生

2. Singleton
底下以 RegisterInstance 的方來來注冊 IUser

        protected void Application_Start()
        {
            IUnityContainer container = new UnityContainer();
 
            container.RegisterInstance<IUser>(new User() { Name = "Unity" });
 
 
            CustomUnityControllerFactory factory = new CustomUnityControllerFactory(container);
 
 
            ControllerBuilder.Current.SetControllerFactory(factory);
 
            RegisterRoutes(RouteTable.Routes);
        }

HomeController
Constructor 中有兩個參數 Service1, Service2
    [HandleError]
    public class HomeController : Controller
    {
        Service1 service1;
        Service2 service2;
 
        public HomeController(Service1 service1, Service2 service2)
        {
            this.service1 = service1;
            this.service2 = service2;
        }
 
        public ActionResult Index()
        {
            ViewData["Message"] = service1.Message();
 
            ViewData["Message2"] = service2.Message();
 
            return View();
        }
 
        public ActionResult About()
        {
            return View();
        }
 
    }

Service1
在呼叫 Message 後會改變 User.Name 的值
    public class Service1 : IService
    {
        IUser user;
 
        public Service1(IUser user)
        {
            this.user = user;
        }
 
 
        #region IService Members
 
 
        public string Message()
        {
            string t = user.Name;
            user.Name = "Yes!! I'm Sigleton";
            return t;
        }
 
        #endregion
    }

Service2
    public class Service2 : IService
    {
        IUser user;
 
        public Service2(IUser user)
        {
            this.user = user;
        }
 
        #region IService Members
 
        public string Message()
        {
            return user.Name;
        }
 
        #endregion
    }
需注意的是 在 Service 的 constructor 中需以 IUser ,如以Class 來當為參數的話。unity會產生一個新的實體。


Reference
Unity framework with ASP.Net MVC Framework

沒有留言: