gpt4 book ai didi

generics - 使用 Unity,如何使用通用接口(interface)自动注册通用类而不向其注册每种类型

转载 作者:行者123 更新时间:2023-12-04 15:05:08 24 4
gpt4 key购买 nike

我正在使用 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();

关于generics - 使用 Unity,如何使用通用接口(interface)自动注册通用类而不向其注册每种类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2248167/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com