Ninject.MVC3, Pass DependencyResolver to service-layer?

前端 未结 1 1982
被撕碎了的回忆
被撕碎了的回忆 2021-02-14 14:25

In a MVC3-application with Ninject.MVC 2.2.0.3 (after merge), instead of injecting repostories directly into controllers I\'m trying to make a service-layer that contain the bus

相关标签:
1条回答
  • 2021-02-14 15:20

    You don't need to pass the object around you can do something like this

    // global.aspx


     protected void Application_Start()
            {
                // Hook our DI stuff when application starts
                SetupDependencyInjection();
            }
    
            public void SetupDependencyInjection()
            {         
                // Tell ASP.NET MVC 3 to use our Ninject DI Container
                DependencyResolver.SetResolver(new NinjectDependencyResolver(CreateKernel()));
            }
    
            protected IKernel CreateKernel()
            {
                var modules = new INinjectModule[]
                                  {
                                     new NhibernateModule(),
                                     new ServiceModule(),
                                     new RepoModule()
                                  };
    
                return new StandardKernel(modules);
            }
    

    So in this one I setup all the ninject stuff. I make a kernal with 3 files to split up all my binding so it is easy to find.


    In my service layer class you just pass in the interfaces you want. This service class is in it's own project folder where I keep all my service layer classes and has no reference to the ninject library.

    // service.cs

        private readonly IRepo repo;
        // constructor
            public Service(IRepo repo)
            {
                this.repo = repo;
            }
    

    This is how my ServiceModule looks like(what is created in the global.aspx)

    // ServiceModule()
     public class ServiceModule : NinjectModule
        {
            public override void Load()
            {
    
               Bind<IRepo>().To<Repo>();
    
    
            }
    
        }       
    

    Seee how I bind the interface to the repo. Now every time it see that interface it will automatically bind the the Repo class to it. So you don't need to pass the object around or anything.

    You don't need worry about importing .dll into your service layer. For instance I have my service classes in their own project file and everything you see above(expect the service class of course) is in my webui project(where my views and global.aspx is).

    Ninject does not care if the service is in a different project since I guess it is being referenced in the webui project.

    Edit

    Forgot to give you the NinjectDependecyResolver

       public class NinjectDependencyResolver : IDependencyResolver
        {
            private readonly IResolutionRoot resolutionRoot;
    
            public NinjectDependencyResolver(IResolutionRoot kernel)
            {
                resolutionRoot = kernel;
            }
    
            public object GetService(Type serviceType)
            {
                return resolutionRoot.TryGet(serviceType);
            }
    
            public IEnumerable<object> GetServices(Type serviceType)
            {
                return resolutionRoot.GetAll(serviceType);
            }
        }
    
    0 讨论(0)
提交回复
热议问题