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<>ステートメントを使用して正しいインスタンスを取得します。

自分の慣習と一緒にスキャンを使用してこれを行うことができるようですが、それを行う方法を正確に理解することはできません。

これはいくつかのサンプルコードです

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>();
        }
    }

I added an intermediate step and checked for a null handler since I didn't have one in my site. But this should get you the missing piece you needed.

于 2012-07-06T19:07:14.457 に答える