gpt4 book ai didi

c# - 如何使用 Unity 映射泛型类型?

转载 作者:行者123 更新时间:2023-12-03 20:38:09 27 4
gpt4 key购买 nike

我正在尝试使用 Unity 配置向类属性添加依赖项,而且我尝试注入(inject)的类型是通用的。

我有接口(interface)

public interface ISendMessage
{
void Send(string contact, string message);
}

public class EmailService : ISendMessage
{
public void Send(string contact, string message)
{
// do
}
}

public class MessageService<T> where T : ISendMessage
{
}

我尝试在其他类中通过构造函数注入(inject)来使用它

public MyService(MessageService<ISendMessage> messageService)
{
}

我如何注入(inject) MessageService<EmailService>而不是 MessageService<ISendMessage>

我尝试通过 app.config 来实现

<alias alias="MessageService'1" type="MyNamespace.MessageService'1, MyAssembly" />
<alias alias="EmailMessageService'1" type="MyNamespace.MessageService'1[[MyNamespace.EmailService, MyAssembly]], MyAssembly" />

我收到错误

The type name or alias MessageService'1 could not be resolved. Please check your configuration file and verify this type name.

以及我如何传递 MessageService<T>执行参数 MessageService<EmailService>

谢谢

更新

我将我的类(class)修改为以下内容:

public class MessageService<T> where T : ISendMessage
{
private T service;

[Dependency]
public T Service
{
get { return service; }
set { service = value; }
}
}

并使用配置

<alias alias="ISendMessage" type="MyNamespace.ISendMessage, MyAssembly" />
<alias alias="EmailService" type="MyNamespace.EmailService, MyAssembly" />

<register type="ISendMessage" mapTo="EmailService">
</register>

有效:-)

最佳答案

你不能简单地使用 MessageService<ISendMessage>MessageService<EmailService> .为此,您需要 MessageService<T>变体。仅接口(interface)(和委托(delegate))支持变体。这不是 Unity 的问题,这是 .NET 框架的“限制”(自 4.0 起支持 C#)。所以需要实现如下接口(interface):

// note the 'out' keyword!!
public interface IMessageService<out T>
where T : ISendMessage
{
T GetSendMessage();
}

MessageService<T>类将必须实现此接口(interface)。但即使使用这段代码,Unity 也不会自动注入(inject)。您将必须在这两种类型之间建立映射。例如,这是一个可能的注册:

container.Register<MessageService<ISendMessage>>(
new InjectionFactory(c =>
c.Resolve<MessageService<EmailService>>()));

请注意,我使用基于代码的配置。尽可能避免使用基于 XML 的配置,因为 XML 配置脆弱、容易出错、功能较弱且难以维护。仅在部署期间或之后注册实际需要的类型(就个人而言,即使那样我也不会使用您的 DI 容器的 XML API)。

关于c# - 如何使用 Unity 映射泛型类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11207886/

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