簡體   English   中英

使用Unity,如何使用通用接口自動調整泛型類,而無需向其注冊每種類型

[英]Using Unity, How do I autoregister a generic class with a generic interface without registering EVERY type to it

我正在使用Unity和Unity.AutoRegistration Unity的這一行:

unityContainer.RegisterType(typeof(IAction<>), typeof(Action<>));

有效地將項目中的每個類注冊到IAction / Action:

unityContainer.RegisterType<IAction<ObjectA>, Action<ObjectA>>();
unityContainer.RegisterType<IAction<ObjectB>, Action<ObjectB>>();
unityContainer.RegisterType<IAction<ObjectC>, Action<ObjectC>>();
[...]
unityContainer.RegisterType<IAction<UnrelatedObject>, Action<UnrelatedObject>>();
[...]

但是,我只想要注冊特定的對象。 我該怎么辦? 我的猜測是為特定的類添加一個自定義屬性裝飾器。

[ActionAtribute]
public class ObjectB
{ [...] }

並嘗試使用Unity.AutoRegistration 這是我被困在的地方:

unityContainer.ConfigureAutoRegistration()
    .Include(If.DecoratedWith<ActionAtribute>,
             Then.Register()
             .As   ?? // I'm guessing this is where I specify
             .With ?? // IAction<match> goes to Action<match>
             )
    .ApplyAutoRegistration();

Include方法具有重載,允許您傳遞lambda以注冊您的類型。 要使用屬性實現您想要的功能,您可以這樣做:

        unityContainer.ConfigureAutoRegistration()
            .Include(If.DecoratedWith<ActionAtribute>,
                     (t, c) => c.RegisterType(typeof(IAction<>).MakeGenericType(t), typeof(Action<>).MakeGenericType(t)))
            .IncludeAllLoadedAssemblies()
            .ApplyAutoRegistration();

此外,Include方法的第一個參數是Predicate,因此如果您不想使用屬性而是使用其他機制來定義要包含或排除的類型,您可以這樣做:

        // You may be getting these types from your config or from somewhere else
        var allowedActions = new[] {typeof(ObjectB)}; 
        unityContainer.ConfigureAutoRegistration()
            .Include(t => allowedActions.Contains(t),
                     (t, c) => c.RegisterType(typeof(IAction<>).MakeGenericType(t), typeof(Action<>).MakeGenericType(t)))
            .IncludeAllLoadedAssemblies()
            .ApplyAutoRegistration();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM