Ninject - nie wypełnia obiektu interface service w controlerze, jest null

0

Witam serdecznie,
skonfigurowałem Ninject, który poprawnie działa w projekcie Service, gdzie jest testowy controller, ale niepoprawnie w projekcie WebGui, gdzie w controlerze obiekty interface nie wypełniają się. Na początku miałem problem, że controller nie ma constructora bezparametrowego, rozwiązanie znalałem, a jest nim :

 public AccountController() : this(DependencyResolver.Current.GetService<IUserService>(), 
            DependencyResolver.Current.GetService<IMainSpeciesService>()) { 
        }

Teraz constructor z parametrami w controllerze odpala się jednak nie wypełnia obiektów interface. Kurza stopa nie wiem co jest nie tak i jak to powinno być odpowiednio skonfigurowane.

Projekt wygląda tak:
http://prnt.sc/ak78wn

KOD..
Services ma referencje do Ninjecta, plik NinjectCommon wygląda następująco:

  public static class NinjectWebCommon 
    {
        private static readonly Bootstrapper bootstrapper = new Bootstrapper();

        /// <summary>
        /// Starts the application
        /// </summary>
        public static void Start() 
        {
            DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
            DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
            bootstrapper.Initialize(CreateKernel);
        }
        
        /// <summary>
        /// Stops the application.
        /// </summary>
        public static void Stop()
        {
            bootstrapper.ShutDown();
        }
        
        /// <summary>
        /// Creates the kernel that will manage your application.
        /// </summary>
        /// <returns>The created kernel.</returns>
        private static IKernel CreateKernel()
        {
            var kernel = new StandardKernel();
            try
            {
                kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
                kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

                RegisterServices(kernel);

                return kernel;
            }
            catch
            {
                kernel.Dispose();
                throw;
            }
        }

        /// <summary>
        /// Load your modules or register your services here!
        /// </summary>
        /// <param name="kernel">The kernel.</param>
        private static void RegisterServices(IKernel kernel)
        {
            kernel.Bind<IAlbumRepository>().To<AlbumRepository>();
            kernel.Bind<ICommentRepository>().To<CommentRepository>();
            kernel.Bind<IGroupRepository>().To<GroupRepository>();
            kernel.Bind<IGroupMemberRepository>().To<GroupMemberRepository>();
            kernel.Bind<IImageRepository>().To<ImageRepository>();
            kernel.Bind<ILikeRepository>().To<LikeRepository>();
            kernel.Bind<IMovieRepository>().To<MovieRepository>();
            kernel.Bind<IPostRepository>().To<PostRepository>();
            kernel.Bind<IUnlikeRepository>().To<UnlikeRepository>();
            kernel.Bind<IUserRepository>().To<UserRepository>();
            kernel.Bind<IUserDataRepository>().To<UserDataRepository>();
            kernel.Bind<IUserFriendRepository>().To<UserFriendRepository>();
            kernel.Bind<IMainSpeciesRepository>().To<MainSpeciesRepository>();

            kernel.Bind<IAlbumService>().To<AlbumServiceImpl>();
            kernel.Bind<ICommentService>().To<CommentServiceImpl>();
            kernel.Bind<IGroupService>().To<GroupServiceImpl>();
            kernel.Bind<IGroupMemberService>().To<GroupMemberServiceImpl>();
            kernel.Bind<IImageService>().To<ImageServiceImpl>();
            kernel.Bind<ILikeService>().To<LikeServiceImpl>();
            kernel.Bind<IMovieService>().To<MovieServiceImpl>();
            kernel.Bind<IPostService>().To<PostServiceImpl>();
            kernel.Bind<IUnlikeService>().To<UnlikeServiceImpl>();
            kernel.Bind<IUserDataService>().To<UserDataServiceImpl>();
            kernel.Bind<IUserService>().To<UserServiceImpl>();
            kernel.Bind<IUserFriendService>().To<UserFriendServiceImpl>();
            kernel.Bind<IMainSpeciesService>().To<MainSpeciesServiceImpl>();
        }        
    } 

Global.asax

public class WebApiApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            GlobalConfiguration.Configure(WebApiConfig.Register);
            AutoMapperServiceConfiguration.Configure();

        }
    } 

Controller w MyPuppy :

 public class AccountController : Controller
    {
        readonly IUserService _userService;
        readonly IMainSpeciesService _mainSpecieService;

        public AccountController() : this(DependencyResolver.Current.GetService<IUserService>(), 
            DependencyResolver.Current.GetService<IMainSpeciesService>()) { 
        }

        public AccountController(IUserService userService, IMainSpeciesService mainSpecieService)
        {
            _userService = userService;
            _mainSpecieService = mainSpecieService;
        }

Jeśli jest potrzeba codu innych plików dajcie znaka.

Proszę o pomoc.
Pozdrawiam

0

Nikt, nic? Jakieś nakierowanie, tutorial cokolwiek?

6
   System.Web.Mvc.DependencyResolver.SetResolver(
                new CustomNinjectDependencyResolver(kernel)
                );

to powinieneś mieć w RegisterServices

CustomResolver powinien wyglądać tak

 public class CustomNinjectDependencyResolver : IDependencyResolver
    {
        private IKernel kernel;

        public CustomNinjectDependencyResolver(IKernel kernel)
        {
            this.kernel = kernel;
            AddBindings();
        }

        public object GetService(Type serviceType)
        {
            return this.kernel.TryGet(serviceType);
        }

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

        private void AddBindings()
        {
            //Tutaj 
            this.kernel.Bind<ICosik>().To<Cosik>();
        }
    }

I masz wstrzykiwanie w konstruktorze, nie musisz pisać tego

 
        public AccountController() : this(DependencyResolver.Current.GetService<IUserService>(), 
            DependencyResolver.Current.GetService<IMainSpeciesService>()) { 
        }
0

WoW ! Niezła robota :D

Bardzo Ci dziękuję ! Stałem z pracą przez to :) Super !

0

Dobra panowie... rozmawiałem z pewną osobą, która ma o wiele większe doświadczenie ode mnie na temat tego ninjecta.

I generalnie otrzymałem takie informacje:

ninject/autofac to wszystko służy tylko i wyłącznie testom
w przeciwnym wypadku zamula bo to refleksja

Czyli, z GUI referencja do Services i nie używać ninjecta w controlerze tylko tworzyć obiekty services co jest wydajniejsze i pracować na takiej zasadzie.

Co Wy na to?

2

Bzdura. Rzeczywiście Ninject jest jednym z najwolniejszych kontenerów IoC, głównie ze względu na refleksję (ale nie wszystkie frameworki jej używają). Ale narzut w aplikacji webowej jest i tak znikomy. Jeśli chcesz bezpośrednio tworzyć obiekty w kontrolerach, zamiast je wstrzykiwać, łamiesz zasadę dependency inversion. A dlaczego jest to złe, możesz już znaleźć tonę argumentów (choćby którykolwiek z wykładów uncle boba na youtube).

1

http://www.palmmedia.de/blog/2011/8/30/ioc-container-benchmark-performance-comparison Pozwolę sobię rzucić artykułem, może trochę stary, ale pokazuje, że niektóre ioc są szybsze niż bez. I ninject nie jest wspierany5 styczeń 2015 jest ostatnia wersja, więc lepiej użyć autofaca.

1
Zainteresowany napisał(a):

ninject/autofac to wszystko służy tylko i wyłącznie testom
w przeciwnym wypadku zamula bo to refleksja

A ten wybitny programista potrafi powiedzieć o ile aplikacja korzystająca z kontenera IoC jest wolniejsza od tej bez niego?
Ja obstawiam setne części procenta.

Czyli, z GUI referencja do Services i nie używać ninjecta w controlerze tylko tworzyć obiekty services co jest wydajniejsze i pracować na takiej zasadzie.

Co Wy na to?

Zawsze wydajniejsze jest NIEPISANIE kodu, więc i nietworzenie obiektów ręcznie, a więc wydajniejsze jest korzystanie z kontenera IoC.

1 użytkowników online, w tym zalogowanych: 0, gości: 1