簡體   English   中英

如何使Simple Injector對同一接口使用不同的具體類,但使用不同的類

[英]How can I cause Simple Injector to use different concrete classes for the same interface, but with different classes

我可以使用構造函數注入使用StructureMap做到這一點。 但是我找不到使用簡單注入器執行此操作的方法。 這是一些說明此情況的代碼(對不起,長度)

我已經在Register方法中查看了lambda,但似乎無法理解如何調用容器的單個應用程序范圍實例來獲取所需的一個實例。

這些是我希望構造的對象圖:

var bannerTalker =
    new LoudMouth(
        new ConsoleShouter(), // Implements IConsoleVoicer
        new ObnoxiousBannerGenerator());

var plainTalker = 
    new TimidSpeaker(
        new ConsoleWhisperer());  // Implements IConsoleVoicer

Here's the code:

``` c#
public interface IConsoleVoicer
{
    void SaySomething(string whatToSay);
}

public class ConsoleWhisperer : IConsoleVoicer
{
    public void SaySomething(string whatToSay)
    {
        Console.WriteLine(whatToSay?.ToLower());
    }
}

public class ConsoleShouter : IConsoleVoicer
{
    public void SaySomething(string whatToSay)
    {
        Console.WriteLine(whatToSay?.ToUpper());
    }
}

public interface IBannerGenerator
{
    string GetBanner();
}

public class ObnoxiousBannerGenerator : IBannerGenerator
{
    public string GetBanner()
    {
        return "OBNOXIOUS";
    }
}

public interface IBannerTalker
{
    void SayWithBanner(string somethingToSay);
}

public class LoudMouth : IBannerTalker
{
    private IConsoleVoicer Voicer { get; set; }
    private IBannerGenerator BannerGenerator { get; set; }

    public LoudMouth(
        IConsoleVoicer concoleVoicer, IBannerGenerator bannerGenerator)
    {
        Voicer = concoleVoicer;
        BannerGenerator = bannerGenerator;
    }

    public void SayWithBanner(string somethingToSay)
    {
        Voicer.SaySomething(string.Format("{0}:{1}",
            BannerGenerator.GetBanner(), somethingToSay));
    }
}

public interface IPlainTalker
{
    void SayIt(string somethingToSay);
}

public class TimidSpeaker : IPlainTalker
{
    private IConsoleVoicer Voicer { get; set; }

    public TimidSpeaker(IConsoleVoicer concoleVoicer)
    {
        Voicer = concoleVoicer;
    }

    public void SayIt(string somethingToSay)
    {
        Voicer.SaySomething(somethingToSay);
    }
}

這就是我嘗試過的:

static void Main(string[] args)
{
    var container = new Container();
    container.Register<IBannerGenerator, ObnoxiousBannerGenerator>();

    container.Register<IPlainTalker, TimidSpeaker>();
    container.Register<IBannerTalker, LoudMouth>();

    //HERE IS THE DILEMMA! How do I assign
    // to IBannerTalker a A LoudMouth contructed with a ConsoleShouter,
    // and to IPlainTalkerTalker a A TimidSpeaker contructed with a ConsoleWhisperer 

    //container.Register<IConsoleVoicer, ConsoleShouter>();
    container.Register<IConsoleVoicer, ConsoleWhisperer>();

    var bannerTalker = container.GetInstance<IBannerTalker>();
    var plainTalker = container.GetInstance<IPlainTalker>();

    bannerTalker.SayWithBanner("i am a jerk");
    plainTalker.SayIt("people like me");
}

Ric .Net正確地指出了RegisterConditional方法。 以下注冊完成了您的任務:

container.Register<IBannerGenerator, ObnoxiousBannerGenerator>();

container.Register<IPlainTalker, TimidSpeaker>();
container.Register<IBannerTalker, LoudMouth>();

container.RegisterConditional<IConsoleVoicer, ConsoleShouter>(
    c => c.Consumer.ImplementationType == typeof(LoudMouth));
container.RegisterConditional<IConsoleVoicer, ConsoleWhisperer>(
    c => c.Consumer.ImplementationType == typeof(TimidSpeaker));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM