Sitecore Glass Mapper V4语言项回退,如何使其与Autofac一起工作?

Sitecore Glass Mapper V4语言项回退,如何使其与Autofac一起工作?,sitecore,autofac,glass-mapper,Sitecore,Autofac,Glass Mapper,我正在使用Glass Mapper v4和Autofac,不知道如何使其与语言项Fall back模块一起工作。下面是创建实现IObjectConstructionTask的类的示例(请参见下文) 公共类FallbackCheckTask:IObjectConstructionTask { public void Execute(ObjectConstructionArgs args) { 如果(args.Result==null) { var scContext=args.AbstractTy

我正在使用Glass Mapper v4和Autofac,不知道如何使其与语言项Fall back模块一起工作。下面是创建实现
IObjectConstructionTask
的类的示例(请参见下文)

公共类FallbackCheckTask:IObjectConstructionTask
{
public void Execute(ObjectConstructionArgs args)
{
如果(args.Result==null)
{
var scContext=args.AbstractTypeCreationContext作为SitecoreTypeCreationContext;
//如果项目本身为空,则无论版本如何,都将中止
if(scContext.Item==null)
{
args.AbortPipeline();
返回;
}
//我们可以尝试将渲染参数转换为玻璃模型,如果是,请返回。
if(String.Compare(scContext.Item.path.FullPath,“[orphan]/renderingParameters”,true)==0)
{
返回;
}
//如果当前语言的上下文项版本计数为0,则默认glassmapper代码将简单地中止管道
//但这并不考虑项目回退
//这里添加了对回退扩展方法GetFallbackItem的检查,递归地(针对链式回退)
//然后,如果该回退项为null或者它的版本计数为0(并且只有那时),您会继续并中止管道吗
if(scContext.Item.Versions.Count==0)
{
var fallBackItem=checkrecursiveforfallbackitem(scContext.Item);
if(fallBackItem==null)
args.AbortPipeline();
else if(fallBackItem.Versions.Count==0)
args.AbortPipeline();
返回;
}
}
}
//在链式回退的情况下,例如fr CA->en CA->en
//可能是中间语言也没有版本,但有一个后备项
//因此,必须进一步检查,直到找到版本,或者没有更多的回退项
FallbackItem(Item thisItem)的私有项递归检查
{
var fallBackItem=thisItem.GetFallbackItem();
if(fallBackItem!=null)
{
如果(fallBackItem.Versions.Count==0)
fallBackItem=递归检查fallBackItem(fallBackItem);
}
返回后备项;
}
}
然后你注册(在温莎城堡)

publicstaticvoidcastleconfig(IWindsorContainer){
var config=new config();
集装箱。登记(
Component.For().ImplementedBy().LifestylePerWebRequest()实现
);
//config.EnableCaching=false;
container.Install(新的SitecoreInstaller(配置));
}
我正在使用Autofac,不知道如何执行与上述相同的操作,并确保它以正确的顺序发生。我正在以典型的方式(见下文)注册我的类型,但它似乎没有挂起我的
FallbackCheckTask

公共静态无效寄存器()
{
var builder=new ContainerBuilder();
注册控制器(类型化(MVCAPApplication).Assembly);
//注册我们的类型
builder.RegisterType();
//构建并设置解析器
var container=builder.Build();
SetResolver(新的AutofacDependencyResolver(容器));
}
如果glass不参与获取条目值,我还将语言项后备连接起来,并按预期工作。我理解为什么Glass没有将数据映射到盒子外,我只是似乎无法使修复工作正常进行。有什么想法吗

编辑2015-05-21 19:00

我编辑了
glassmappercustom.cs
如下:

public静态idependencysolver CreateResolver(){
var config=new Glass.Mapper.Sc.config();
var解析器=新的依赖解析程序(配置);
解析程序.ObjectConstructionFactory.Add(()=>new FallbackCheckTask());
返回解析器;
}
现在它调用
FallbackCheckTask
Execute
方法,仅当该项有版本时才调用,若并没有版本,则不调用该方法。此外,如果启用此任务,无论我做什么,我的测试查询项始终返回为NULL:

var test=SitecoreContext.QuerySingle({7A6D933A-127B-4C08-B073-7C39F16EBD06});
var test1=SitecoreContext.Query({7A6D933A-127B-4C08-B073-7C39F16EBD06}”).ToList();
var test2=SitecoreContext.GetCurrentItem();
var test3=SitecoreContext.GetItem({7A6D933A-127B-4C08-B073-7C39F16EBD06});

总而言之,我现在的情况比以前好了一点,但是当任务类注册后,无论它们是否有版本,所有项的查询都返回为null。如前所述,我们非常感谢您的帮助。

我知道您提到您正在使用
VersionCountDisabler
,但它看起来像这样吗:

使用(新版本CountDisabler()){
var test=SitecoreContext.QuerySingle({7A6D933A-127B-4C08-B073-7C39F16EBD06});
var test1=SitecoreContext.Query({7A6D933A-127B-4C08-B073-7C39F16EBD06}”).ToList();
var test2=SitecoreContext.GetCurrentItem();
var test3=SitecoreContext.GetItem({7A6D933A-127B-4C08-B073-7C39F16EBD06});
}
或者你用其他方式禁用了它

我还注意到,您的回退代码似乎没有更新
scContent.Item
属性。我认为您需要将其更新为以下内容:

公共类FallbackCheckTask:IObjectConstructionTask
{
public void Execute(ObjectConstructionArgs args)
{
如果(args.Result==null)
{
var scContext=args.AbstractTypeCreat