开发者

Error: The creation delegate must not return null in Autofac?

In my project I am using Autofac. Previously it was working fine. Now I have added some new code in Autofac and it's giving me "The creation delegate must not return null " error.

The changes that I have made are as follows

 builder.Register<Rep>(c => {
                                      /*Get Session and LoginId*/

                               return session.CreateQuery(@"from Rep where LoginId='" +
                                                   L开发者_运维技巧oginId+ "'").List<Rep>().
                                                   FirstOrDefault() ?? new Rep();
                            });
 builder.Register<TestPermissionHelper>();

Now in the Global.asax, in Applicaiton_PostAuthenticate() method I am resolving TestPermissionHelper.

The interesting thing is that, when I am hitting the login page at the time it is giving me error, else it is working fine.

I know it is hard to understand the entire picture from this small code. It will be great if someone can at least tell me, in general what are the possible reason for this type of error.

Thanks

Note: If it can help, I am also giving the Stack Trace of the error

    Stack trace:    at Autofac.Component.Activation.DelegateActivator.ActivateInstance(IContext context, IEnumerable`1 parameters)
   at Autofac.Component.Registration.ResolveInstance(IContext context, IEnumerable`1 parameters, IDisposer disposer, Boolean& newInstance)
   at Autofac.Context.TryResolve(Service service, Object& instance, IEnumerable`1 parameters)
   at Autofac.Context.Resolve(Service service, IEnumerable`1 parameters)
   at Autofac.Context.Resolve(Type serviceType, IEnumerable`1 parameters)
   at Autofac.Component.Activation.AutowiringParameter.<>c__DisplayClass2.<CanSupplyValue>b__0()
   at Autofac.Component.Activation.DirectConstructorInvoker.<InvokeConstructor>b__0(Func`1 pa)
   at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
   at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   at Autofac.Component.Activation.DirectConstructorInvoker.InvokeConstructor(IContext context, IEnumerable`1 parameters, ConstructorInfo ci, Func`1[] args)
   at Autofac.Component.Activation.ReflectionActivator.ConstructInstance(ConstructorInfo ci, IContext context, IEnumerable`1 parameters, Func`1[] parameterAccessors)
   at Autofac.Component.Activation.ReflectionActivator.ActivateInstance(IContext context, IEnumerable`1 parameters)
   at Autofac.Component.Registration.ResolveInstance(IContext context, IEnumerable`1 parameters, IDisposer disposer, Boolean& newInstance)
   at Autofac.Context.TryResolve(Service service, Object& instance, IEnumerable`1 parameters)
   at Autofac.Context.Resolve(Service service, IEnumerable`1 parameters)
   at Autofac.Context.Resolve(Type serviceType, IEnumerable`1 parameters)
   at Autofac.Context.Resolve[TService](IEnumerable`1 parameters)
   at Autofac.Context.Resolve[TService](Parameter[] parameters)
   at Autofac.Container.Resolve[TService](Parameter[] parameters)


The root cause of the issue does not seem to be in Autofac. In case the Rep table has no entry for the login id you create a new Rep object. If is used as a dependency in other components, you need to ensure that they don't refer to non-instantiated reference properties of the Rep object.


Your code seems good enough and I cannot see how the delegate registration would ever return null unless some error occurs.

I would suggest writing some unit tests that tries out resolving TestPermissionHelper with various return values (including null) from the Rep registration. Hopefully you're able to reproduce the error and isolate the condition in which the error occurs.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜