Как передать сервисы с использованием ninject или другой инфраструктуры внедрения зависимостей в класс, расширяющий AreaRegistration - PullRequest
0 голосов
/ 24 октября 2018

У меня есть следующая задача: мне нужно создать модульное веб-приложение asp.net mvc 5, которое будет создавать отчеты.Для этого я решил создать службу (IReportsCollectorService), которая собирает информацию о каждом отчете из каждого файла .dll, который имеет класс, расширяющий AreaRegistration.

Я попытался передать IReportsCollectorService с помощью InjectAttribute, также я попытался передать его с помощью DependencyResolver.

Однако, когда я передаю его с InjectAttribute, я получаю нулевое значение.С другой стороны, когда я передаю его с помощью DependencyResolver, я получаю службу и могу добавить необходимую информацию в словарь службы коллектора, но когда я получаю службу в другом классе или в контроллере, добавленные данные теряются.Я даже пытался получить само Ядро, но результат был тот же.

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

Редактировать: класс NinjectModule добавлен в пример кода.

Пример кода:Класс регистрации области:

    public class NamePasswordAndEmailAreaRegistration : AreaRegistration
{
    // this is the collector service which adds the needed info to a dictionary.
    //[Inject]
    public IReportsCollectorService CollectorService => NinjectContainer.GetKernel().Get<IReportsCollectorService>();
    public override string AreaName
    {
        get
        {
            return "NameReportArea";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        var collectorItem = new ReportsCollectorItem()
        {
            ItemName = "NameReport",
            ReportFileName = "NameReportFileName"
        };

        CollectorService.AddReportItem(collectorItem.ItemName, collectorItem);
    }

Класс контейнера Ninject:

    public class NinjectContainer
{
    private static NinjectResolver _resolver;

    public static void RegisterModules(params NinjectModule[] modules)
    {
        _resolver = new NinjectResolver(modules);
        DependencyResolver.SetResolver(_resolver);
    }

    public static void RegisterAssembly()
    {
        _resolver = new NinjectResolver(Assembly.GetExecutingAssembly());

        DependencyResolver.SetResolver(_resolver);
    }

    public static T Resolve<T>()
    {
        return _resolver.Kernel.Get<T>();
    }

    public static IKernel GetKernel()
    {
        return _resolver.Kernel;
    }
}

И это начальный класс приложения:

        public class MvcApplication : HttpApplication
{
    protected void Application_Start()
    {
        InitNinject();
        var smt = DependencyResolver.Current;
        AreaRegistration.RegisterAllAreas();

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

        ModelBinders.Binders.DefaultBinder = new DevExpress.Web.Mvc.DevExpressEditorsBinder();

        DevExpress.Web.ASPxWebControl.CallbackError += Application_Error;
    }

    private void InitNinject()
    {
        NinjectContainer.RegisterAssembly();
    }

    protected void Application_Error(object sender, EventArgs e)
    {
        Exception exception = System.Web.HttpContext.Current.Server.GetLastError();
    }
}

А это класс NinjectModule:

     public class Bindings : Ninject.Modules.NinjectModule
{
    public override void Load()
    {
        Bind<IReportsCollectorService>().To<ReportCollectorService>();
    }
}
...