在我的项目中,我使用的是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)
答案 0 :(得分:0)
您的代码似乎已经足够好了,除非发生错误,否则我无法看到委托注册如何返回null
。
我建议编写一些单元测试,尝试用TestPermissionHelper
注册中的各种返回值(包括null)解析Rep
。希望您能够重现错误并隔离发生错误的情况。
答案 1 :(得分:0)
问题的根本原因似乎不在Autofac中。 如果Rep表没有登录ID的条目,则创建一个新的Rep对象。如果在其他组件中用作依赖项,则需要确保它们不引用Rep对象的非实例化引用属性。