首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >命名和非命名类型的Autofac集合

命名和非命名类型的Autofac集合
EN

Stack Overflow用户
提问于 2014-06-05 10:44:09
回答 1查看 81关注 0票数 0

我正在使用autofac并有大量的规则要解决,它们被传递到特定的验证器中,这些验证器使用一些通用规则和一些特定的规则。尼尼姆有一个.WhenInjectedInto属性,我知道.Named<T>("")给了我类似的功能。但

考虑到以下代码:

是否可以使用Foo和FooBar填充IFooValidator的规则。

IBarValidator的规则中填充了Bar和FooBar?

我有以下代码:

代码语言:javascript
复制
public static class Dependencies
    {
        public static IContainer Configure()
        {
            var builder = new ContainerBuilder();

            builder.RegisterType<Foo>().As<IRule>();
            builder.RegisterType<Bar>().As<IRule>();

            builder.RegisterType<FooBar>().As<IRule>();

            builder.RegisterType<Foos>().As<IFooValidator>();
            builder.RegisterType<Bars>().As<IBarValidator>();

            return builder.Build();
        }
    }

    public interface IRule
    {
        string Name { get; }
    }

    public class Foo : IRule
    {
        public string Name { get { return "Foo"; }}
    }

    public class Bar : IRule
    {
        public string Name { get { return "Bar"; } }
    }

    public class FooBar : IRule
    {
        public string Name { get { return "FooBar"; } }
    }

    public interface IFooValidator
    {
        IList<IRule> Rules { get; set; }
    }

    public interface IBarValidator
    {
        IList<IRule> Rules { get; set; }
    }

    public class Foos : IFooValidator
    {
        public IList<IRule> Rules { get; set; }

        public Foos(IList<IRule> foo)
        {
            Rules = foo;
        }
    }

    public class Bars : IBarValidator
    {
        public IList<IRule> Rules { get; set; }

        public Bars(IList<IRule> bars)
        {
            Rules = bars;
        }
    }

我知道可以用以下方法来完成:

代码语言:javascript
复制
builder.Register<IFooValidator>(context =>
            {
                var foos = context.ResolveNamed<IList<IRule>>("Foo");
                var foobar = context.Resolve<IList<IRule>>();

                return new Foos(foos.Concat(foobar).ToList());

            });

但感觉很乱,还有别的办法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-05 11:06:34

我已经解决了:

代码语言:javascript
复制
            builder.RegisterType<Foo>().Named<IRule>("Foo");
            builder.RegisterType<Bar>().Named<IRule>("Bar");

            builder.RegisterType<FooBar>()
                .As<IRule>()
                .Named<IRule>("Foo")
                .Named<IRule>("Bar");

            builder.RegisterType<Foos>().As<IFooValidator>().WithParameter((info, context) => info.Name == "foo", (info, context) => context.ResolveNamed<IList<IRule>>("Foo"));

如果有人能提供一个更好的答案,请这样做,我会很高兴地标记它。

更新

在考虑了这个问题之后,像这样注入依赖是没有意义的。因为任何改变都需要重建。我决定将应用程序的这一部分重构为使用组合和继承,而不是聚合和DI。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24058083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档