工厂对象或功能,或通过Unity容器?

时间:2015-06-05 23:30:29

标签: c# dependency-injection unity-container factory factory-pattern

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

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

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

消费者可能会说,"请给我一个名为'乔治'"并且提供者将查看名为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);
        }

    }

...以上,我在哪里??????是我试图解决的问题。

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

如果这是一个序列号提供者,那么它将能够生成&#34;下一个&#34;许多不同产品系列的序列号。因此,如果有人要求下一个#34; Green Shoe Model#3&#34;它将提供该系列中的下一个值。然后当被要求下一个&#34;黄色自行车&#34;它将提供该系列中的下一个值。

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

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

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

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

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

或者,我可以向提供商提供工厂对象,但这会将问题转移到工厂 - 但至少看起来更适合工厂访问我的DI容器...

编辑#1

好的,我更新了上述内容 - 我的对象并不是真正的缓存 - 它是各种提供商。它的工作是在被问到时提供新的价值。所以我改写了大部分问题并重命名了部分代码。实际问题没有改变,但我相信它回答了问题&#34;为什么我的缓存无论如何都会产生新值?&#34;

如果您对我在此编辑中谈论缓存的原因感到困惑,请不要担心 - 我用来描述问题的示例(错误)将myValueProvider表示为缓存

1 个答案:

答案 0 :(得分:1)

你在这里混淆了一些问题。它是你的缓存,它负责缓存对象。您正在尝试添加创建对象的职责。对象创建可能并不简单。并且在创建对象时发生更改的每种类型都需要更新缓存类。因此,您的缓存应该公开缓存和检索对象表单缓存的方法。委派责任为客户端代码创建对象。 如果你真的想要这个设计,我会定义可以创建对象的工厂:

interface IMyObjectCreater
{
  IMyinterface Create();
}

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

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

public myCache(IMyObjectCreator o)
{
}

}