У меня есть следующая задача: мне нужно создать модульное веб-приложение 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>();
}
}