0

我在 StructureMap 中有这个注册

ObjectFactory.Initialize(x => {
    x.For<IPageModel>().UseSpecial(y => y.ConstructedBy( r => ((MvcHandler) HttpContext.Current.Handler).RequestContext.RouteData.GetCurrentModel<IPageModel>()));
});

然后我像这样在构造函数中访问这个对象

public HomeController(IPageModel model) {}

现在我想注册实现接口 IPageModel 的所有具体类型,当被要求时,我想使用相同的 For<> 语句来获取正确的实例。

似乎我可以将 Scan 与我自己的约定一起使用来做到这一点,但我不知道该怎么做。

这是一些示例代码

x.Scan(scanner =>
{
    scanner.AssembliesFromApplicationBaseDirectory();
    scanner.Convention<MySpecialConvetion>();
});

public class MySpecialConvetion : IRegistrationConvention {
    public void Process(Type type, Registry registry) {
        if(type.IsAssignableFrom(typeof(IPageModel))) {
            registry.For<CONCRETE IMPLEMENTATION>().UseSpecial(y => y.ConstructedBy( r => ((MvcHandler) HttpContext.Current.Handler).RequestContext.RouteData.GetCurrentModel<CONCRETE IMPLEMENTATION>()));
        }
    }
}

编辑:似乎我需要使用非泛型 For,但是如何使用非泛型 For 处理我自己的构造?

4

1 回答 1

0

我通过创建一个通用方法定义来完成这项工作,并使用反射来填充类型。显示比解释容易:

    public class MySpecialConvetion : IRegistrationConvention
    {
        public static readonly MethodInfo RegisterMethod = typeof (MySpecialConvetion)
            .GetMethod("Register", BindingFlags.NonPublic | BindingFlags.Static)
            .GetGenericMethodDefinition();

        public void Process(Type type, Registry registry)
        {
            if (type.IsAssignableFrom(typeof (IPageModel)))
            {
                var specificRegisterMethod = RegisterMethod.MakeGenericMethod(new[] { type });
                specificRegisterMethod.Invoke(null, new object[] { registry });
            }
        }

        static private void Register<T>(Registry registry)
            where T : IPageModel
        {
            registry
                .For<T>()
                .UseSpecial(y => y.ConstructedBy(r => GetCurrentPageModel<T>()));
        }

        static private T GetCurrentPageModel<T>()
            where T : IPageModel
        {
            var handler = (MvcHandler) HttpContext.Current.Handler;
            if (handler == null)
                return default(T);
            return handler.RequestContext.RouteData.GetCurrentModel<T>();
        }
    }

我添加了一个中间步骤并检查了一个空处理程序,因为我的站点中没有一个。但这应该会为您提供所需的缺失部分。

于 2012-07-06T19:07:14.457 回答