gpt4 book ai didi

dependencies - Ninject/DI 在简单场景中有用吗?

转载 作者:行者123 更新时间:2023-12-01 07:28:00 26 4
gpt4 key购买 nike

在过去的几天里,我看了很多 IOC/DI/ninject 教程和视频,但我仍然不相信我明白了这一点。

在大多数示例中,他们通常会说,如果我们想要剑或手里剑会发生什么,我们需要定义 IWeapon。我们想将实际武器的知识与战士分开。

因此,我们将所需的 IWeapon 注入(inject)到 Warrior 中,然后让 Ninject(或其他)为我们提供进入 IWeapon 所需的类(例如剑或手里剑),但随后他们继续创建一个默认绑定(bind),该绑定(bind)创建一个单一的绑定(bind)IWeapon 之剑。

我们如何告诉它使用哪一个?我们不能使用命名绑定(bind),因为您不能在武器上设置命名绑定(bind)然后获取。

就我而言,我有一条消息正在从队列中读取,它将包含有关发送内容和发送给谁的必要详细信息。

我还有一个接口(interface),它知道如何发送带有 SMS、电子邮件、iphone 等实现的消息。在这种情况下,我无法理解如何使用 DI,而不必在我的代码中的某处放置一个开关 :-(

public interface INotify
{
void Send(Message msg);
}

public class Message
{
public Message(INotify notify)
{
_notify = notify;
}
public void Send()
{
_notify.Send(this);
}

readonly INotify _notify;
public string Type { get; set; }
public string Text{ get; set; }
public string Name { get; set; }
public string Number { get; set; }
public string Email { get; set; }
}


_kernel.Bind<INotify>().To<NotifyEmail>();
//kernel.Bind<INotify>().To<NotifySMS>().Named("sms");
//kernel.Bind<INotify>().To<NotifyAPNS>().Named("iphone");

var msg = _kernel.Get<Message>();
msg.Send();

使实例化所需的类变得容易不是重点吗?

最佳答案

DI 是将您的软件放在一起,而不是解决您的业务逻辑。在您的场景中,您尝试从 IoC 容器中解析 DTO,这被认为是不好的做法。

这意味着您必须以不同的方式为您的应用程序建模。例如。以下伪代码将为您提供一种处理这种情况的方法的想法:

public interface INotify
{
string Type { get; }
void Send(Message msg);
}

public class Message
{
public string Type { get; set; }
public string Text{ get; set; }
public string Name { get; set; }
public string Number { get; set; }
public string Email { get; set; }
}

public class MessageProcessor
{
public MessageProcessor(IEnumerable<INotify> notifiers, IMessageQueue)
{
this.notifiers = notifiers.ToDictionary(n => n.Type, n);
}

public void Process()
{
while (!TerminateApplication)
{
var msg = this.queue.GetNextMessage();
this.notifiers[msg.Type].Send(msg);
}
}
}


public void Main()
{
using (var kernel = new StandardKernel())
{
kernel.Bind<INotifier>().To<NotifyEmail>();
kernel.Bind<INotifier>().To<NotifySms>();
kernel.Bind<INotifier>().To<Notify>();
kernel.Bind<MessageProcessor>().ToSelf();

kernel.Get<MessageProcessor>().Process();
}
}

关于dependencies - Ninject/DI 在简单场景中有用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13967132/

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