gpt4 book ai didi

c# - 注册泛型,其中 T 在特定命名空间中

转载 作者:行者123 更新时间:2023-11-30 17:44:18 25 4
gpt4 key购买 nike

我目前有这样的东西:

new ContainerBuilder()
.RegisterGeneric(typeof(MyFactory<>))
.As(typeof(IMyFactory<>))
.WithParameter("param", "abc")
.SingleInstance();

我想限制上面的 T (在 MyFactory<T> 中)在特定命名空间中的位置。

RegisterGeneric() 这可能吗? ?如果我使用 RegisterAssemblyTypes()那么我应该可以使用 Where(type => type.IsInNamespace("..."))并分别注册每种类型。

这是推荐的方法吗?

最佳答案

没有简单的方法可以做到这一点。顺便说一下,你可以使用 OnActivating事件以根据您的类型的 namespace 替换实例。

假设您在不同的命名空间中有类型:

public interface IFoo
{ }
namespace X
{
public class FooX : IFoo { }
}
namespace Y
{
public class FooY : IFoo { }
}

和 1 个通用 Factory和 2 个具体的:

public interface IFooFactory<TFoo>
where TFoo : IFoo
{
TFoo Create();
}

public class XFactory<TFoo> : IFooFactory<TFoo>
where TFoo : IFoo
{
public TFoo Create()
{
throw new NotImplementedException();
}
}
public class YFactory<TFoo> : IFooFactory<TFoo>
where TFoo : IFoo
{
public TFoo Create()
{
throw new NotImplementedException();
}
}
public class DefaultFactory<TFoo> : IFooFactory<TFoo>
where TFoo : IFoo
{
public TFoo Create()
{
throw new NotImplementedException();
}
}

您可以像这样注册您的特定工厂:

ContainerBuilder builder = new ContainerBuilder();
builder.RegisterGeneric(typeof(XFactory<>))
.Named("ProjectNamespace.X", typeof(IFooFactory<>));
builder.RegisterGeneric(typeof(YFactory<>))
.Named("ProjectNamespace.Y", typeof(IFooFactory<>));

你的通用工厂是这样的:

builder.RegisterGeneric(typeof(DefaultFactory<>))
.As(typeof(IFooFactory<>))
.OnActivating(e =>
{
Type elementType = e.Instance.GetType().GetGenericArguments()[0];
Type fooFactoryType = typeof(IFooFactory<>).MakeGenericType(elementType);
Service service = new KeyedService(elementType.Namespace, fooFactoryType);
Object fooFactory = e.Context.ResolveOptionalService(service, e.Parameters);
if (fooFactory != null)
{
e.ReplaceInstance(fooFactory);
}
});

只有默认工厂注册为IFooFactory<> .如果您尝试解决 IFooFactory<X.FooX>然后 OnActivating事件将替换默认的工厂实例,您将获得一个 XFooFactory<X.FooX>

这样做的主要缺点是 DefaultFactory<>每次都会被实例化。如果此注册依赖于其他注册或初始化需要时间,则可能会出现问题。

关于c# - 注册泛型,其中 T 在特定命名空间中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29829298/

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