gpt4 book ai didi

c# - 使用注入(inject)的通用类型变体实现服务定位器

转载 作者:行者123 更新时间:2023-11-30 12:48:06 26 4
gpt4 key购买 nike

我有以下内容:

public interface IConverter<TValue, TConverted>
{
}

public interface IConverterProvider
{
IConverter<TValue, TConverted> GetConverter<TValue, TConverted>();
}

在设置时使用示例绑定(bind):

Bind<IConverter<System.Int32, System.String>>().To<Int32ToStringConverter>();
Bind<IConverter<System.Guid, System.String>>().To<GuidToStringConverter>();

所以我有一组固定的转换器,没有重复的绑定(bind)。

[问题]我的问题是如何实现 IConverterProvider 并注入(inject)映射到单例的可用绑定(bind)字典?或者换句话说,如何避免运行时服务定位器模式。

目前我只是每次都使用 NInject 内核来解析,但我认为这是一种反模式。我想要的是这样的:

public class ConverterProvider : IConverterProvider
{
private Dictionary<Type, object> _converters;

public ConverterProvider(Dictionary<Type, object> converters)
{
_converters = converters;
}

public IConverter<TValue, TConverted> GetConverter<TValue, TConverted>()
{
var fullTypeResolve = typeof (IConverter<,>).MakeGenericType(typeof (TValue), typeof (TConverted));

return _converters.Where(x => x.Key == fullTypeResolve).Select(x=>x.Value).Cast<IConverter<TValue, TConverted>>().Single();
}
}

但这实际上要求我能够从依赖项注入(inject)内核中解析并获取所有 IConverter<,> 的列表,而我之前从 NInject 中尝试这样做的尝试并未成功。

最佳答案

这由 Ninject.Extensions.Factory 支持

Bind<IConverter<System.Int32, System.String>>().To<Int32ToStringConverter>();
Bind<IConverter<System.Guid, System.String>>().To<GuidToStringConverter>();
Bind<IConverterProvider>().ToFactory();

无需实现

GetConverter 重命名为 CreateConverter 或其他不以 Get 开头的名称

关于c# - 使用注入(inject)的通用类型变体实现服务定位器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15108358/

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