gpt4 book ai didi

c# - 如何将此服务定位器模式转变为真正的依赖注入(inject)模式?

转载 作者:太空狗 更新时间:2023-10-30 00:26:49 25 4
gpt4 key购买 nike

我一分钟前问了一个更笼统的问题:How to organize DI Framework usage in an application? ,我得到的反馈是我使用的是服务定位器模式,而不是 Martin Fowler 在这里指出的真正的 DI:http://martinfowler.com/articles/injection.html

其实,我前几天刚看过那篇文章,但显然还没有完全理解。

假设我有以下代码:

interface ICardReader
{
string GetInfo();
void SetDebugMode(bool value);
void Initialize(string accountToken);
void ShowAmount(string amount);
void Close();

ICreditCardInfo GetCardInfo();
}

public class MagTekIPAD: ICardReader
{
public ICreditCardInfo GetCardInfo()
{
var card = GetCardDataFromDevice();

// apparently the following line is wrong?
var ccInfo = Inject<ICreditCardInfo>.New();

ccInfo.Track1 = MakeHex(card.EncTrack1);
ccInfo.Track2 = MakeHex(card.EncTrack2);
ccInfo.MagSignature = MakeHex(card.EncMP);
ccInfo.MagSwipeKeySN = MakeHex(card.KSN);
ccInfo.MagSignatureStatus = MakeHex(card.MPSts);
ccInfo.MagDeviceSN = ipad.Serial;
ccInfo.MSREncryptType = "MAGENSA_V5";

return ccInfo;
}

// Other implementation details here ...
}

在这个例子中,我可以将依赖项注入(inject)到构造函数中——我认为这是修复“这个”场景的正确方法。

但是,如果我真的需要创建未知数量的相关对象(或者是否有任何其他正当理由我需要在类中动态创建依赖项)怎么办?

最佳答案

这个例子给我的印象是您尝试使用 IoC 容器以 ICreditCardInfo 命名创建数据传输对象。这样的对象不应该像服务那样​​有任何真正的依赖关系。创建 DTO 的正确方法是使用 new 运算符:

return new CreditCardInfo(
MakeHex(card.EncTrack1),
MakeHex(card.EncTrack2),
MakeHex(card.EncMP),
MakeHex(card.KSN),
MakeHex(card.MPSts),
ipad.Serial,
"MAGENSA_V5");

关于c# - 如何将此服务定位器模式转变为真正的依赖注入(inject)模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9373004/

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