gpt4 book ai didi

c# - 委托(delegate)在依赖注入(inject)中扮演什么角色?

转载 作者:行者123 更新时间:2023-12-02 02:46:50 25 4
gpt4 key购买 nike

在大多数依赖注入(inject)示例中,我看到简单的对象被注入(inject),例如下面的示例中SecurityManager被注入(inject)到MainApplication中。

但是,注入(inject)委托(delegate)似乎也很自然,如下面的示例所示,LogHandler被注入(inject)到MainApplication中。

委托(delegate)通常不用于依赖注入(inject)吗?支持和反对使用它们的理由是什么?

using System;
using System.Windows;
using System.Windows.Controls;

namespace TestSimpleDelegate82343
{
public partial class Window1 : Window
{
public delegate void LogHandler(string message);

public Window1()
{
InitializeComponent();
}

private void Button_Gui_Lax_Click(object sender, RoutedEventArgs e)
{
MainApplication app = new MainApplication(new LogHandler(GuiLogHandler), new LaxSecurityManager());
}

private void Button_Console_Lax_Click(object sender, RoutedEventArgs e)
{
MainApplication app = new MainApplication(new LogHandler(ConsoleLogHandler), new LaxSecurityManager());
}

private void Button_Gui_Tough_Click(object sender, RoutedEventArgs e)
{
MainApplication app = new MainApplication(new LogHandler(GuiLogHandler), new ToughSecurityManager());
}

private void Button_Console_Tough_Click(object sender, RoutedEventArgs e)
{
MainApplication app = new MainApplication(new LogHandler(ConsoleLogHandler), new ToughSecurityManager());
}

public void GuiLogHandler(string message)
{
TextBlock tb = new TextBlock();
tb.Text = "logging: " + message;
TheContent.Children.Add(tb);
}

public void ConsoleLogHandler(string message)
{
Console.WriteLine("logging: " + message);
}
}

public interface ISecurityManager
{
bool UserIsEntitled();
}

public class LaxSecurityManager : ISecurityManager
{
public bool UserIsEntitled()
{
return true;
}
}

public class ToughSecurityManager : ISecurityManager
{
public bool UserIsEntitled()
{
return false;
}
}

public class MainApplication
{
public MainApplication(Window1.LogHandler logHandler, ISecurityManager securityManager)
{
logHandler("test1");
logHandler("test2");
logHandler("test3");
if (securityManager.UserIsEntitled())
{
logHandler("secret");
}
}
}

}

最佳答案

我偶尔使用委托(delegate) Anonymous Interfaces - 也适用于 DI。

然而,这种方法的一个问题是,对在类中注入(inject)和使用正确的依赖项进行单元测试变得有点困难,因为委托(delegate)实例不是一种类型,有时您会只是想验证一个类是否使用正确类型的策略/依赖关系。

关于c# - 委托(delegate)在依赖注入(inject)中扮演什么角色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1536758/

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