【问题标题】:Providing Autofac with pre-resolved dependencies为 Autofac 提供预先解决的依赖项
【发布时间】:2017-09-28 15:08:43
【问题描述】:

如果我在问这个问题时犯了任何错误,请原谅我,因为这是我在这个网站上提出的第一个问题。

我目前正在尝试将 Autofac 添加到已经存在的项目中。我已经使用 Autofac 大约 6 个小时和 C# 大约 4 周,我最初是一名 Python 开发人员,所以请原谅任何 C# 无知。我目前有以下测试方法:`

    public static void BasicTest()
    {
        using (var scope= Program.container.BeginLifetimeScope())
        {
            ITradeManager tm = scope.Resolve<ITradeManager>();
            List<IGameData> gamesList = new List<IGameData>();
            List<IUserData> usersList = new List<IUserData>();
            IScraperManager sc = scope.Resolve<IScraperManager>(new NamedParameter("sc",(scope.Resolve<UniScraper>(new NamedParameter("games", gamesList), new NamedParameter("users", usersList)))));
            IDatabaseIC db = scope.Resolve<IDatabaseIC>();
            IAppCore app = scope.Resolve<IAppCore>(
                new NamedParameter("tm", tm),
                new NamedParameter("sc", sc),
                new NamedParameter("db", db));

            IUserData tradeUser = scope.Resolve<IUserData>();

            app.Initialise(tradeUser, uniUser);

            app.Run();
        }

并具有以下容器设置:

static void Main(string[] args)
    {
        var builder = new ContainerBuilder();
        builder.RegisterType<AppCore>().As<IAppCore>();
        builder.RegisterType<DatabaseInteractionControler>().As<IDatabaseIC>();
        builder.RegisterType<ScraperManager>().As<IScraperManager>();
        builder.RegisterType<TradeManager>().As<ITradeManager>();
        builder.RegisterType<GameData>().As<IGameData>();
        builder.RegisterType<UserData>().As<IUserData>();
        builder.RegisterType<Scrapers.Scrapers.Uni.UniScraper>().AsSelf().As<IBaseScraper>();
        builder.RegisterType<Scrapers.Scrapers.Hill.HillScraper>().AsSelf().As<IBaseScraper>();
        builder.RegisterType<Scrapers.Marathon.MarathonScraper>().AsSelf().As<IBaseScraper>();

        container = builder.Build();

        Tests.AppTest.BasicTest();

    }

我的问题是,当我尝试将已经解析的对象作为参数传递给 Autofac 以解析 IAppcore 时,它​​会忽略我作为参数传递的已经解析的对象,而不是像我没有传递任何参数一样尝试解析对它!

我是否错过了一些理解,或者是否有一个明显的解决方案我对 C# 和 Autofac 太陌生而无法轻易看到?

如果您有兴趣,我最初编写的项目(现在转换为使用 Autofac)是一组简单的网络爬虫,可以从各种不同的网站提取体育新闻,并将它们收集到一个方便的小型桌面应用程序中。

【问题讨论】:

    标签: c# autofac


    【解决方案1】:

    根据这个测试,一个猜测是您的命名参数的名称(“tm”、“sc”、“db”)与类的构造函数中这些参数的实际名称不匹配。如果它们不匹配,Autofac 不会抛出异常。它只是解析注册类型的实例并忽略您的NamedParameter

    澄清一下,如果你的构造函数看起来像这样:

    public SomeConstructor(SomeRequiredDependency xyz)
    

    那么NamedParameter中指定的名称必须是“xyz”。

    public class RequiresDependency
    {
        public RequiresDependency(Dependency dependency)
        {
            Dependency = dependency;
        }
    
        public Dependency Dependency { get; }
    }
    
    public class Dependency
    {}
    
    [TestClass]
    public class AutofacTest
    {
        [TestMethod]
        public void ResolvesWithSpecifiedParameters()
        {
            var builder = new ContainerBuilder();
            builder.RegisterType<RequiresDependency>();
            builder.RegisterType<Dependency>();
            var myDependency = new Dependency();
            using (var container = builder.Build())
            {
                var resolved =
                    container.Resolve<RequiresDependency>(new NamedParameter("dependency", myDependency));
                Assert.AreSame(myDependency, resolved.Dependency);
            }
        }
    
        [TestMethod]
        public void ResolvesWithRegisteredTypeIfParameterNameDoesntMatch()
        {
            var builder = new ContainerBuilder();
            builder.RegisterType<RequiresDependency>();
            builder.RegisterType<Dependency>();
            var myDependency = new Dependency();
            using (var container = builder.Build())
            {
                var resolved =
                    container.Resolve<RequiresDependency>(new NamedParameter("x", myDependency));
                Assert.AreNotSame(myDependency, resolved.Dependency);
            }
        }
    }
    

    【讨论】:

    • 谢谢!这么多我显然只是愚蠢....好吧,至少我有我的第一个 SO 问题,也是我的第一个令人尴尬的 SO 问题一次解决了大声笑
    • 没有理由感到尴尬。我敢肯定,切换到一门新语言的认知负担让我很难发现每一个细节。
    猜你喜欢
    • 2014-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 2019-03-23
    • 1970-01-01
    相关资源
    最近更新 更多