StructureMap IoC 在运行时获取实例的问题

发布于 2024-08-31 08:45:50 字数 588 浏览 7 评论 0原文

我有 2 个具体类型“CategoryFilter”&实现的“StopWordsFilter” “IWordTokensFilter”。

以下是我的设置:

ForRequestedType<IWordTokensFilter>().TheDefaultIsConcreteType<CategoryFilter>()
            .AddInstances(x =>
            {
                x.OfConcreteType<StopWordsFilter>();
            }
        );

问题是结构图自动将其注入到我的类中时的运行时。我有相同插件类型的参数:

public ClassA(IWordTokensFilter stopWordsFilter, IWordTokensFilter categoryFilter)

我总是在第一个参数中得到 CategoryFilter,但它应该是 stopWordsFilter。

我怎样才能以正确的方式设置这个?提前致谢

i have 2 concrete types "CategoryFilter" & "StopWordsFilter" that implements
"IWordTokensFilter".

Below is my setup:

ForRequestedType<IWordTokensFilter>().TheDefaultIsConcreteType<CategoryFilter>()
            .AddInstances(x =>
            {
                x.OfConcreteType<StopWordsFilter>();
            }
        );

The problem is the run-time when structure map auto inject it on my class, bec. i have arguments with same plugin-type:

public ClassA(IWordTokensFilter stopWordsFilter, IWordTokensFilter categoryFilter)

i'm always getting CategoryFilter in my first argument but it should be stopWordsFilter.

How can i setup this in a right way? thanks in advance

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

煞人兵器 2024-09-07 08:45:50

有多种可能的解决方案:

1)ClassA 是否需要区分过滤器,或者只需要运行它们?如果没有,您可以更改构造函数以接受数组,这将导致注入 IWordTokensFilter 的所有已注册实例:

public ClassA(IWordTokensFilter[] filters)

然后您可以对过滤器进行 foreach 来应用它们。

2)如果您确实需要区分它们,因为它们需要以不同的方式使用,您可以考虑让一个人实现一个标记接口,以更好地描述其用途。然后可以将 ClassA 更改为接受 IWordTokensFilter 和 ICategoryFilter(或任何您命名的标记接口)。向 ICategoryFilter 注册 CategoryFilter,然后两者都会被正确注入。

public ClassA(IWordTokensFilter stopWordsFilter, ICategoryFilter categoryFilter)

3) 您可以明确告诉 StructureMap 如何创建 ClassA:

ForRequestedType<ClassA>().TheDefault.Is.ConstructedBy(c => {
  return new ClassA(c.GetInstance<StopWordsFilter>(), c.GetInstance<CategoryFilter>());
});

4) 您可以告诉 StructureMap 覆盖 ClassA 的依赖项之一:

x.ForRequestedType<ClassA>().TheDefault.Is.OfConcreteType<ClassA>()
  .CtorDependency<IWordTokensFilter>("stopWordsFilter").Is<StopWordsFilter>();

There are a number of possible solutions:

1) Does ClassA need to differentiate between the filters, or does it just need to run them both? If not, you can change the constructor to accept an array, which will cause all registered instances of IWordTokensFilter to be injected:

public ClassA(IWordTokensFilter[] filters)

You can then foreach over the filters to apply them.

2) If you do need to differentiate them, because they need to be used differently, you may consider having one implement a marker interface the better describes its purpose. ClassA could then be changed to take in an IWordTokensFilter and an ICategoryFilter (or whatever you name the marker interface). Register CategoryFilter with ICategoryFilter and then both will be injected properly.

public ClassA(IWordTokensFilter stopWordsFilter, ICategoryFilter categoryFilter)

3) You can tell StructureMap explicitly how to create ClassA:

ForRequestedType<ClassA>().TheDefault.Is.ConstructedBy(c => {
  return new ClassA(c.GetInstance<StopWordsFilter>(), c.GetInstance<CategoryFilter>());
});

4) You can tell StructureMap to override one of the dependencies for ClassA:

x.ForRequestedType<ClassA>().TheDefault.Is.OfConcreteType<ClassA>()
  .CtorDependency<IWordTokensFilter>("stopWordsFilter").Is<StopWordsFilter>();
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文