工厂对象或函数,或传递 Unity 容器?

Factory Object or Function, or Pass Unity Container?

我有一个为各种消费者提供序列值的对象。

提供者必须管理许多序列,因为消费者可能会要求为任何一个正在进行的序列获取新值。

所有序列都遵循相同的模式,但它们是路径相关的,因此带有很多状态。所以生成序列的工作被委托给另一个对象。

消费者可能会说,"Please give me the next value in the sequence named 'George'" 并且提供者将查看名为 George 的序列是否已经在进行中,如果没有,它想要开始一个新序列(然后它将管理)。

样本:

class myValueProvider
{
    private Dictionary<string, IPathDependentValueGenerator > NamedSequences = new Dictionary<string, IMyInterface>();

    public IMyInterface GetNextValueForName(string SequenceName)
    {
        IPathDependentValueGenerator O;
        NamedSequences.TryGetValue(SequenceName, out O);
        if (o == null)
        {
            O = ????? /// How do I make my new value generator?
            NamedSequences.Add(key, O);
        }

    }

...所以上面,我在哪里有??????是我要解决的问题。

如果您想尝试将其映射到现实世界的问题中,我能想到的最简单的例子就是序列号。

如果这是一个序列号提供商,那么它将能够为许多不同的产品线生成 "Next" 序列号。因此,如果有人向它询问 "Green Shoe Model #3" 的下一个序列号,它会提供该系列中的下一个值。然后,当询问 [​​=48=] 的下一个序列号时,它将提供该系列中的下一个值。

提供者不需要知道用于获取下一个值的计算的详细信息,事实上,该计算必须是可交换的。因此我希望以某种方式注入它。

当提供者需要一个新的 O 时,必须正确配置该 O - 这需要提供者没有的知识(但在创建 DI 容器时已知)。

此外,至少目前,当 Provider 需要一个新的 O 时,它想要的 O 将始终相同(因此所有 O 都将使用相同的类型、构造函数参数和注入的属性创建)。

提供者对象本身将通过 Unity 创建。理想情况下,在我注册提供者对象的同时,我还会做一些事情来具体化所创建的新 O 的确切类型和配置。

如果我让提供者访问容器本身,我可以很容易地做到这一点,但这似乎是错误的。

或者,我可以向提供者提供一个工厂对象,但这会将问题转移到工厂中——但至少工厂访问我的 DI 容器似乎更合适...

编辑 #1

好的,我更新了上面的内容——我的对象并不是真正的缓存——它是某种提供者。它的工作是在被询问时提供新的价值。所以我改写了大部分问题并重命名了部分代码。实际问题没有改变,但我相信它回答了问题 "Why is my cache generating new values anyway?"

如果您对我为什么要在这次编辑中谈论缓存感到困惑,请不要担心 - 我最初用来描述问题的示例(错误地)将 myValueProvider 表示为缓存。

你在这里混淆了问题。它是您的缓存,它负责缓存对象。您正在尝试增加创建对象的责任。对象创建可能并不简单。并且在创建对象时发生变化的每种类型都需要更新缓存 class。所以你的缓存应该公开方法来缓存和检索对象形式的缓存。将创建对象的责任委托给客户端代码。 如果你真的想要这个设计,我会定义可以创建对象的工厂:

interface IMyObjectCreater
{
  IMyinterface Create();
}

class MyConcreteCreator : IMyObjectCreator
{
IMyinterface Create()
{
return new MyObject();
}
}

并在 Unity 容器中注册此工厂,将构造函数参数添加到缓存 class:

public myCache(IMyObjectCreator o)
{
}

}