MVC下 使用 Ninject 建立依赖委托

1 篇文章 0 订阅
</pre><p></p><pre name="code" class="csharp">
第一次写文章,就吧昨天看书学习的Ninject,使用方法给大家说一说。

首先 Ninject 通俗点说就是帮你初始化对象的这么一个东西,看下源代码

IValueCalculator calc = new LinqValueCalculator();

我们看到当要使用对象的时候必须要创建  LinqValueCalculator 对象,在实际项目中需要操作很多对象,这样一一创建非常不理智,这个时候Ninject出现,让它来帮我们完成吧。


要使用必须要有Ninject组件,我用Nuget方式下载安装 如图:(我用的是mvc4 空项目测试)



安装完成之后,我们在Model下建立以下几个类 IValueCalculator,LinqValueCalculator 是继承关系

public class DiscountHelper : IDiscountHelper  

{  

public decimal DiscountSize { get; set; }  

public decimal ApplyDiscount(decimal totalParam)  

{  

return (totalParam - (DiscountSize / 100m * totalParam));  

}  

}



public class LinqValueCalculator : IValueCalculator
    {
        private IDiscountHelper discount;

        public LinqValueCalculator(IDiscountHelper discountParam)
        {
            discount = discountParam;
        }
        public decimal ValueProducts(IEnumerable<Products> products)
        { 
            //return products.Sum(p => p.Price);
            return discount.ApplyDiscount(products.Sum(s => s.Price));
        }
    }

然后创建一个基础类NinjectDependencyResolver 继承IDependencyResolver

public class NinjectDependencyResolver:IDependencyResolver
    {
        private IKernel kernel;
        
        public NinjectDependencyResolver()
        {
            kernel = new StandardKernel();
            AddBindings();
        }

        //mvc在需要一个实例以便对一个传入的请求进行服务时,会调用GetService(),GetServices()方法
        public object GetService(Type serviceType)
        {
            return kernel.TryGet(serviceType);
        }

        public IEnumerable<object> GetServices(Type serviceType)
        {
            return kernel.GetAll(serviceType);
        }

        private void AddBindings()
        {
            kernel.Bind<IValueCalculator>().To<LinqValueCalculator>();
            kernel.Bind<IDiscountHelper>().To<DiscountHelper>().WithPropertyValue("DiscountSize", 50M).WithPropertyValue("DiscountSize2", 1M);
            kernel.Bind<IDiscountHelper>().To<FlexibleDiscountHelper>().WhenInjectedInto<LinqValueCalculator>();//当注入LinqValueCalculator时使用FlexibleDiscountHelper
        }
    }



然后在 Global.asax 注册以下,告诉mvc框架要使用的以来解析器

public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            //告诉MVC框架 我要用自己的依赖解析器
            DependencyResolver.SetResolver(new NinjectDependencyResolver());

            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
        }
    }


这个时候新建home控制器 如下 

public class HomeController : Controller
    {
        //
        // GET: /Home/
        private Products[] products = { 
                                      new Products{Name="aa",Category="aaaa",Price=90.5M},
                                      new Products{Name="bb",Category="bbbb",Price=9.4M},
                                      new Products{Name="cc",Category="cccc",Price=0.1M}
                                      };
        private IValueCalculator calc;

        public HomeController(IValueCalculator calcParam)
        {
            calc = calcParam;
        }
        public ActionResult Index()
        {
            //IValueCalculator calc = new LinqValueCalculator();

            ShoppingCart cart = new ShoppingCart(calc) { myProducts = products };
            decimal tot = cart.CalculateProductTotal();
            return View(tot);
        }

    }


可以看出在调用的时候声明一个属性 在整个home控制器下都可以进行访问,创建实例的活就交个ninject去干。

其实不只有ninject可以干这个,还有很多可以达到同样的效果,比如spring.net 等都是很好用的。

ps:第一次写,漏写了好多,毕竟上班时间写的,有点乱,还请多多体谅。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值