ProCoSys / Bifrost

Application Development Framework promoting good development practices such as CQRS and MVVM (see readme)
http://bifrost.dolittle.com
Other
1 stars 1 forks source link

Ninject Binding Error during startup of application #66

Open trymh opened 7 years ago

trymh commented 7 years ago

Exception thrown during initialization ?

Http request: GET /Bifrost/Application?applicationBuildTime=12.10.2016%2011:59:03

Error log: https://procosys.statoil.com/elmah.axd/detail?id=daa27293-6239-4de7-9923-762ba2ef3c0e

System.NullReferenceException: Object reference not set to an instance of an object. at Ninject.Planning.Bindings.BindingConfiguration.GetProvider(IContext context) at Ninject.Activation.Context.ResolveInternal(Object scope) at Ninject.Activation.Context.Resolve() at System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext() at System.Linq.Enumerable.Single[TSource](IEnumerable1 source) at Bifrost.FluentValidation.Commands.CommandValidatorProvider.b16_0(Type v) in C:\T\f0471d076df39445\Source\Bifrost.FluentValidation\Commands\CommandValidatorProvider.cs:line 137 at System.Linq.Enumerable.WhereSelectListIterator2.MoveNext() at System.Linq.Buffer1..ctor(IEnumerable1 source) at System.Linq.Enumerable.ToArray[TSource](IEnumerable1 source) at Bifrost.FluentValidation.Commands.CommandValidatorProvider.BuildDynamicallyDiscoveredInputValidator(Type commandType, IDictionary`2 typeAndAssociatedValidatorTypes) in C:\T\f0471d076df39445\Source\Bifrost.FluentValidation\Commands\CommandValidatorProvider.cs:line 137 at Bifrost.FluentValidation.Commands.CommandValidatorProvider.GetInputValidatorFor(Type commandType) in C:\T\f0471d076df39445\Source\Bifrost.FluentValidation\Commands\CommandValidatorProvider.cs:line 105 at Bifrost.FluentValidation.MetaData.ValidationMetaDataGenerator.GenerateFor(Type typeForValidation) in C:\T\f0471d076df39445\Source\Bifrost.FluentValidation\MetaData\ValidationMetaDataGenerator.cs:line 62 at Bifrost.Validation.MetaData.ValidationMetaData.GetMetaDataFor(Type typeForValidation) in C:\T\f0471d076df39445\Source\Bifrost\Validation\MetaData\ValidationMetaData.cs:line 46 at Bifrost.Web.Commands.CommandValidationPropertyExtender.Extend(Type commandType, String propertyName, Observable observable) in C:\T\f0471d076df39445\Source\Bifrost.Web\Commands\CommandValidationPropertyExtender.cs:line 37 at Bifrost.Web.Commands.CommandProxies.<>c__DisplayClass8_2.b10(String propertyName, Observable observable) in C:\T\f0471d076df39445\Source\Bifrost.Web\Commands\CommandProxies.cs:line 94 at Bifrost.CodeGeneration.JavaScript.AssignmentExtensions.WithObservable(Assignment assignment, ObservableVisitor visitor) in C:\T\f0471d076df39445\Source\Bifrost\CodeGeneration\JavaScript\AssignmentExtensions.cs:line 133 at Bifrost.CodeGeneration.JavaScript.ContainerExtensions.AddObservablePropertiesFromType(Container parent, IEnumerable1 properties, Action1 assignmentVisitor, ObservableVisitor observableVisitor) in C:\T\f0471d076df39445\Source\Bifrost\CodeGeneration\JavaScript\ContainerExtensions.cs:line 140 at Bifrost.CodeGeneration.JavaScript.ContainerExtensions.WithObservablePropertiesFrom(Container container, Type type, Type excludePropertiesFrom, Func2 propertyVisitor, Action1 assignmentVisitor, ObservableVisitor observableVisitor) in C:\T\f0471d076df39445\Source\Bifrost\CodeGeneration\JavaScript\ContainerExtensions.cs:line 53 at Bifrost.Web.Commands.CommandProxies.<>c__DisplayClass8_1.b__6(TypeExtension t) in C:\T\f0471d076df39445\Source\Bifrost.Web\Commands\CommandProxies.cs:line 83 at Bifrost.CodeGeneration.JavaScript.AssignmentExtensions.WithType(Assignment assignment, Action1 callback) in C:\T\f0471d076df39445\Source\Bifrost\CodeGeneration\JavaScript\AssignmentExtensions.cs:line 89 at Bifrost.Web.Commands.CommandProxies.Generate() in C:\T\f0471d076df39445\Source\Bifrost.Web\Commands\CommandProxies.cs:line 81 at Bifrost.Web.Proxies.GeneratedProxies..ctor(CommandProxies commandProxies, QueryProxies queryProxies, ReadModelProxies readModelProxies, ServiceProxies serviceProxies, NamespaceConfigurationProxies namespaceConfigurationProxies, HubProxies hubProxies, ITypeDiscoverer typeDiscoverer, IContainer container) in C:\T\f0471d076df39445\Source\Bifrost.Web\Proxies\GeneratedProxies.cs:line 46 at DynamicInjector60832d98b29e48cb8fd8f6359bb1e606(Object[] ) at Ninject.Activation.Context.ResolveInternal(Object scope) at Ninject.Activation.Context.Resolve() at System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext() at System.Linq.Enumerable.Single[TSource](IEnumerable`1 source) at Infrastructure.Container.ProCoSysContainer.Get[T]() in C:\T\19d6398c6fa70ad6\Infrastructure\Container\ProCoSysContainer.cs:line 34 at Bifrost.Web.Application.ApplicationHttpHandler.InitializeIfNotInitialized() in C:\T\f0471d076df39445\Source\Bifrost.Web\Application\ApplicationHttpHandler.cs:line 103 at Bifrost.Web.Application.ApplicationHttpHandler.OutputContent(HttpContext context) in C:\T\f0471d076df39445\Source\Bifrost.Web\Application\ApplicationHttpHandler.cs:line 82 at Bifrost.Web.Application.ApplicationHttpHandler.ProcessRequest(HttpContext context) in C:\T\f0471d076df39445\Source\Bifrost.Web\Application\ApplicationHttpHandler.cs:line 66 at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

trymh commented 7 years ago

Same error in another app: https://procosys.statoil.com/elmah.axd/detail?id=4aa5ed7c-408b-4965-be27-fe4db6910117

System.NullReferenceException: Object reference not set to an instance of an object. at Ninject.Planning.Bindings.BindingConfiguration.GetProvider(IContext context) at Ninject.Activation.Context.ResolveInternal(Object scope) at Ninject.Activation.Context.Resolve() at System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext() at System.Linq.Enumerable.Single[TSource](IEnumerable1 source) at Bifrost.Execution.OrderedInstancesOf1.<GetEnumerator>d__3.MoveNext() in C:\T\f0471d076df39445\Source\Bifrost\Execution\OrderedInstancesOf.cs:line 46 at System.Linq.Enumerable.Aggregate[TSource,TAccumulate](IEnumerable1 source, TAccumulate seed, Func`3 func) at Infrastructure.Database.LazyTransactionalSession.GetCurrentSession() in C:\T\19d6398c6fa70ad6\Infrastructure\Database\LazyTransactionalSession.cs:line 31 at Read.CheckList.Home.CheckListSearches.get_Query() in C:\T\558d715eec7d76df\Read\CheckList\Home\CheckListSearches.cs:line 20

bnordli commented 7 years ago

Possibly related to http://stackoverflow.com/questions/13475769/ninject-binding-getprovider-throws-nullreferenceexception

the only way I can think of this could happen is if you are adding bindings during runtime. But this isn't recommended anyway because it will give you an unpredictable outcome

Bifrost (and ProCoSys) is absolutely not adhering to this principle, so quite a lot of changes is needed to make sure bindings is not added after the first get. Basically, every usage of IContainer should be split in two halves:

  1. During configuration, only Bind methods are allowed, and a temporary container system (a la ITypeDiscoverer/IImplementorFinder) should be used to retrieve instances.
  2. After configuration is finished, only Get methods are allowed.

An incomplete list of issues: