Инъекция зависимостей Ninject в MVC3 - вне контроллера - PullRequest
3 голосов
/ 11 ноября 2011

Мы используем Ninject в нашем проекте MVC3 для внедрения зависимостей.Я использовал NuGet для добавления ссылок на пакеты к пакетам Ninject и Ninject.MVC3.Когда я сделал это, он создал класс NinjectMVC3 в моей папке App_Start:

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

    public static void Start()
    {
        DynamicModuleUtility.RegisterModule(typeof(OnePerRequestModule));
        DynamicModuleUtility.RegisterModule(typeof(HttpApplicationInitializationModule));
        bootstrapper.Initialize(CreateKernel);
    }

    public static void Stop()
    {
        bootstrapper.ShutDown();
    }

    private static IKernel CreateKernel()
    {
        var kernel = new StandardKernel();
        RegisterServices(kernel);
        return kernel;
    }

    private static void RegisterServices(IKernel kernel)
    {           
        kernel.Bind<IPrincipal>().ToMethod(c => HttpContext.Current.User);
    }
}

До сих пор это прекрасно работало для разрешения зависимостей в моих контроллерах:

public class HomeController : Controller {
    protected IPrincipal principal { get; set; }

    public HomeController(IPrincipal principal) {
        this.principal = principal;
    }
}

Этот контроллер имеет зависимостьна IPrincipal, который я настроил в своем классе начальной загрузки для разрешения HttpContext.Current.User.У меня есть другой класс, который имеет зависимость от IPrincipal, который не является контроллером:

public class NonControllerClass
{
    protected IPrincipal Principal { get; set; }

    public NonControllerClass(IPrincipal principal) {
    }
}

Как мне решить эту зависимость?Как бы я это сделал, если бы это не был параметр конструктора?} * +1010 *

1 Ответ

3 голосов
/ 11 ноября 2011

Ну, в идеале это никогда не должно быть проблемой. Все зависимости должны быть интегрированы в ваш контроллер, и любые зависимости, от которых зависят эти зависимости, также должны автоматически вводиться.

В MVC (почти) все начинается с контроллера. Таким образом, вы можете иметь:

public class HomeController : Controller { 
    protected IMyService myService { get; set; } 

    public HomeController(IMyService myService) { 
        this.myService = myService; 
    } 
} 

public class MyService {
    protected IPrincipal principal;

    public MyService(IPrincipal principal) { this.principal = principal)
}

Обратите внимание, что вам не нужно ничего делать, ваш сервис автоматически получает нужные зависимости, потому что ваш сервис был введен в ваш контроллер.

Однако могут быть случаи, когда вам нужно динамически создавать объект. В этом случае вы можете использовать MVC DependencyResolver.

var principal = DependencyResolver.Current.GetService<IPrincipal>();

Однако вам следует избегать этого, за исключением случаев, когда это абсолютно необходимо, поскольку это считается антишаблоном (известным как расположение службы). Иногда у вас нет большого выбора.

Если вы не хотите использовать инъекцию конструктора, вы можете использовать инъекцию свойства.

public class MyService {
    [Inject]
    public IPrincipal principal {get; set;}
}
...