ASP.NET MVC - использование привязок Ninject вне контроллеров - PullRequest
4 голосов
/ 25 марта 2011

Я использую ASP.NET MVC3 и Ninject. Я установил стандартную реализацию кода в «AppStart_NinjectMVC3.cs», которая устанавливает привязки и добавляет ядро ​​в DependencyResolver следующим образом:

    public static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<IUserRepository>().To<UserRepository>();
        ...
    }

    public static void Start() {
        IKernel kernel = new StandardKernel();
        RegisterServices(kernel);
        DependencyResolver.SetResolver(new NinjectServiceLocator(kernel));
    }

В моих контроллерах все работает нормально, зависимости исправляются нормально.

Я бы хотел использовать Ninject и эти привязки вне контроллеров и вне стека MVC. Например, у меня есть куча обычных aspx-страниц, на которых я хотел бы использовать свое недействительное ядро, а также некоторый код, висящий на global.asax.

Могу ли я повторно использовать свое ядро ​​Ninject в этих других местах или мне нужно также зарегистрировать ядро ​​в моем приложении Global.asax?

Ответы [ 2 ]

2 голосов
/ 25 марта 2011

Текущая версия разработки, найденная на http://teamcity.codebetter.com, обеспечивает поддержку побочного использования обычных страниц aspx, mvc и wcf. Возможно, вы захотите взглянуть на это.

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

Вам нужно

  • Ninject
  • Ninject.Web.Common
  • Ninject.Web
  • Ninject.Web.MVC3
0 голосов
/ 25 марта 2011

Я использовал расширение Ninject MVC в своем приложении ASP.NET MVC.

Вот способ, которым я достиг того, чего, я думаю, вы пытаетесь достичь.

Global.asax.cs:

public class MvcApplication : NinjectHttpApplication
{
    /// <summary>
    /// Overridden Ninject method that is called once the application has started and is initialized
    /// </summary>
    protected override void OnApplicationStarted()
    {
        AreaRegistration.RegisterAllAreas();
        RegisterRoutes(RouteTable.Routes);

        // Tell the MVC Framework to use our implementation of metadataprovider.
        ModelMetadataProviders.Current = new XXX.myNamespace.MetadataProvider();

        // Tell the MVC Framework to use our CartModelBinder class
        ModelBinders.Binders.Add(typeof(Cart), new CartModelBinder());
    }


    /// <summary>
    /// Establish a reference to our DIFactory object
    /// <remarks>
    /// This application currently uses Ninject for dependency injection.
    /// </remarks>
    /// </summary>
    /// <returns></returns>
    protected override IKernel CreateKernel()
    {
        return DIFactory.GetNinjectFactory();
    }

    // snip... additional global.asax.cs methods
}

DIFactory.cs:

/// <summary>
/// This class is used as a container for dependency injection throughout the entire application
/// </summary>
public class DIFactory
{
    public static IKernel _kernel = null;
    /// <summary>
    /// Method used to create a single instance of Ninject's IKernel
    /// </summary>
    /// <returns>IKernel</returns>
    public static IKernel GetNinjectFactory()
    {
        if (_kernel == null)
        {
            var modules = new INinjectModule[]
            {
                new ServiceModule()
            };

            _kernel = new StandardKernel(modules);
        }
        return _kernel;
    }

    /// <summary>
    /// Method used as a service locator for the IConfiguration interface
    /// </summary>
    /// <returns></returns>
    public static IConfiguration CreateConfigurationType()
    {
        return _kernel.Get<IConfiguration>();
    }

    // snip....additional public static methods for all other Interafaces necessary
}

ServiceModule.cs:

/// <summary>
/// Configures how abstract service types are mapped to concrete implementations
/// </summary>
internal class ServiceModule : NinjectModule
{
    public override void Load()
    {
        Bind<IConfiguration>().To<XXX.myNamespace.Configuration>();

        // snip... all other bindings to interfaces
    }
}

Использование в других классах, кроме контроллеров:

UserInteraction.cs:

public class UserInteraction : IUserInteraction
{
    private IConfiguration configuration;

    public bool SubmitFeedback(Feedback feedback)
    {
        try
        {
            this.configuration = DIFactory.CreateConfigurationType();
            // snip additional logic...

        }
        catch(Exception ex)
        {
            // snip
        }
    }
 }
...