如果我在提出这个问题时犯了任何错误,请原谅我,因为这是我在本网站上提出的第一个问题。
我目前正在尝试将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)是一组简单的网络抓取工具,可以从各种不同的网站收集体育新闻,并将它们收集在一个方便的小桌面应用程序中。
答案 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);
}
}
}