我试图使用C# DI方法来实现一些东西。以下是我的代码片段。
public interface IMessageService
{
void Send(string uid, string password);
}
public class MessageService : IMessageService
{
public void Send(string uid, string password)
{
}
}
public class EmailService : IMessageService
{
public void Send(string uid, string password)
{
}
}
以及创建ServiceLocator的代码:
public static class ServiceLocator
{
public static object GetService(Type requestedType)
{
if (requestedType is IMessageService)
{
return new EmailService();
}
else
{
return null;
}
}
}
现在,我用创建一个测试代码
public class AuthenticationService
{
private IMessageService msgService;
public AuthenticationService()
{
this.msgService = ServiceLocator
.GetService(typeof(IMessageService)) as IMessageService;
}
}
但看起来,我总是得到GetService()
函数返回的null
。相反,我希望通过GetService()
函数获取EmailService
object,那么如何正确地实现呢?
我试图使用C# DI方法来实现一些东西。以下是我的代码片段
没有称为“C# DI 方法”的模式。我假设我们在这里的任务是为 DI 使用服务定位器模式。别这样!
ServiceLocator可以说是一种反模式,因为类依赖关系是隐藏的,所以会导致维护噩梦。在大多数现实场景中,我们应该避免使用它。
借助一些DI框架,例如SimpleInjector
(它可以是任何其他著名的DI框架),您可以获得相同的结果。然而,这一次代码将更易于维护,也更易于测试。为此,我们可以创建一个Mock
但是,让我们回到主题,看看如何在这里使用< code>Simpleinjector
:
public class AuthenticationService
{
private readonly IMessageService _msgService;
public AuthenticationService(IMessageService msgService)
{
this._msgService = msgService;
}
}
为了在代码中使用它,我们需要注册这个依赖项。一个最小的代码示例是:
var container = new SimpleInjector.Container();
container.Register<IMessageService, EmailService>();
container.Verify();
这就是它所需要的一切!
附言:这不是这个特定DI框架的广告。随意使用任何其他框架,我在这个例子中使用它,因为我更熟悉它
您传入的是Type
的实例。
因此,请求的此条件类型为 IMessage 服务
从来都不是真的
。
你需要做的是
public static object GetService(Type requestedType)
{
if (requestedType == typeof(IMessageService))
{
return new EmailService();
}
else
{
return null;
}
}
顺便提一下,这是一个非常糟糕的模式-您所谓的服务定位器
具有具体类型的具体知识。你最好使用反射或一些传统的注册模式,使IoC成为通用的。
本文向大家介绍关于C++的强制类型转换浅析,包括了关于C++的强制类型转换浅析的使用技巧和注意事项,需要的朋友参考一下 前言 一说起强制类型转换大家都很熟悉,相信很多学习完C++的朋友还在使用C语言的强制类型的方式 (类型)变量. C++其实也具有自己的一套强制类型转换它们分明是:static_cast reinterpret_cast const_cast dynamic_cast四种类型
问题内容: 众所周知,C#提供了一个AS关键字,该关键字会自动执行一次检查,检查对象是否属于某种类型,如果是,则将其强制转换为所需的类型,否则给出null。 在上面的示例中,这里的Object obj可以是User类型或其他类型。用户将获得User类型的对象或null。这是因为C#的As关键字首先执行检查,然后在可能的情况下将对象强制转换为结果类型。 那么Java中有没有与C#的AS关键字等效的关
为什么要在 Car 的无参构造函数中 调用 CTyre(); ???? 就算不写 CTyre(); , 程序也是会默认调用 CTyre 类的无参构造函数的啊 !!!
本文向大家介绍关于C++类的成员初始化列表的相关问题,包括了关于C++类的成员初始化列表的相关问题的使用技巧和注意事项,需要的朋友参考一下 在以下四中情况下,要想让程序顺利编译,必须使用成员初始化列表(member initialization list): 1,初始化一个引用成员(reference member); 2,初始化一个常量对象(const member); 3,调用一个基类的构造函
本文向大家介绍关于C#中排序函数的总结,包括了关于C#中排序函数的总结的使用技巧和注意事项,需要的朋友参考一下 sort 函数对数组中的数据进行升序排序,(其中,sort函数有很多重载的形式,这里不再一一的说明) Reverse函数对数组中的数据进行降序排序, 如何把二个数组联系在一起进行排序操作呢? 例,在学生的信息中有学号和姓名,按学号输出学生的信息怎样实现??? 以上这篇关于C#中排序函数的
下面的代码在无法通过条件颜色时编译。深色和彩色。浅色,因为这两个类是抽象的。 我错过什么了吗?