为Autofac提供预先解析的依赖关系

时间:2017-09-28 15:08:44

标签: c# autofac

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

我目前正在尝试将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)是一组简单的网络抓取工具,可以从各种不同的网站收集体育新闻,并将它们收集在一个方便的小桌面应用程序中。

1 个答案:

答案 0 :(得分:0)

根据这个测试,一个猜测是你的命名参数的名字(&#34; tm&#34;,&#34; sc&#34;,&#34; db&#34;)没有&#39; t匹配类中的那些参数的实际名称&#39;构造函数。如果他们不匹配,Autofac不会抛出异常。它只是解析了已注册类型的实例并忽略了您的NamedParameter

澄清一下,如果您的构造函数如下所示:

public SomeConstructor(SomeRequiredDependency xyz)

然后NamedParameter中指定的名称必须为&#34; xyz&#34;。

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);
        }
    }
}