如何将此服务定位器模式转换为真正的依赖注入模式?

Bra*_*ore 4 .net c# dependency-injection ioc-container inversion-of-control

我在一分钟前问了一个更普遍的问题:如何在应用程序中组织DI Framework使用?我得到的反馈是我使用服务定位器模式而不是真正的DI,正如Martin Fowler在这里指出的那样: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 ...
}
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我可以将依赖注入到构造函数中 - 我认为这是修复'this'场景的正确方法.

但是,如果我真的需要创建一个未知数量的对象(或者是否有任何其他正当理由我需要在课堂上动态创建依赖)呢?

Rem*_*oor 7

此示例让我觉得您尝试ICreditCardInfo使用IoC容器命名地创建数据传输对象.这些对象不应该像服务那样​​具有任何真正的依赖关系.创建DTO的正确方法是使用new运算符:

return new CreditCardInfo(
        MakeHex(card.EncTrack1),
        MakeHex(card.EncTrack2),
        MakeHex(card.EncMP),
        MakeHex(card.KSN),
        MakeHex(card.MPSts),
        ipad.Serial,
        "MAGENSA_V5");
Run Code Online (Sandbox Code Playgroud)