错误:创建委托不得在Autofac中返回null?

时间:2010-05-11 14:23:55

标签: c# asp.net-mvc autofac

在我的项目中,我使用的是Autofac。以前它工作正常。现在我在Autofac中添加了一些新代码,它给了我“创建委托不能返回null ”错误。

我所做的更改如下

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

                               return session.CreateQuery(@"from Rep where LoginId='" +
                                                   LoginId+ "'").List<Rep>().
                                                   FirstOrDefault() ?? new Rep();
                            });
 builder.Register<TestPermissionHelper>();

现在在Global.asax中,在Applicaiton_PostAuthenticate()方法中,我正在解析TestPermissionHelper

有趣的是,当我在登录页面时它给我错误,否则它工作正常。

我知道很难从这个小代码中理解整个画面。如果某人至少可以告诉我一般情况下这种错误的可能原因是什么,那就太好了。

由于

注意:如果它可以提供帮助,我也会给出错误的堆栈跟踪

    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)

2 个答案:

答案 0 :(得分:0)

您的代码似乎已经足够好了,除非发生错误,否则我无法看到委托注册如何返回null

我建议编写一些单元测试,尝试用TestPermissionHelper注册中的各种返回值(包括null)解析Rep。希望您能够重现错误并隔离发生错误的情况。

答案 1 :(得分:0)

问题的根本原因似乎不在Autofac中。 如果Rep表没有登录ID的条目,则创建一个新的Rep对象。如果在其他组件中用作依赖项,则需要确保它们不引用Rep对象的非实例化引用属性。