美好的一天,
我正在尝试在控制器构造函数中实现一个参数,但我无法理解如何实现这一点。
在我的Startup.cs>
中public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Framework.Configuration.GetConnectionString("ConnectionString")));
services.AddSingleton<TestCaseManager>(); // This is what I think i have to do
services.AddMvc();
}
上面你可以看到我尝试将一个TestCaseManager添加到服务
public class TestCaseController : Controller
{
// The scoped Application context
protected ApplicationDbContext m_Context;
protected TestCaseManager m_TestCaseManager;
public TestCaseController(ApplicationDbContext pContext, TestCaseManager pTestCaseManager)
{
m_Context = pContext;
m_TestCaseManager = pTestCaseManager;
m_Context.Database.EnsureCreated();
}
}
上面你可以看到传入了DbContext和TestCaseManager。我能够正确传递上下文,但是当我尝试传入管理器时应用程序就会中断。
如果有人能帮助解释如何正确地做到这一点,那就太好了。
不,请不要建议只在构造中添加经理。
处理请求时发生未处理的异常。 InvalidOperationException:无法解析类型为&#39; NQAP.Common.Stores.TestCaseStore`1 [NQAP.Common.Models.TestCaseModel]&#39;尝试激活NQAP.Common.Managers.TestCaseManager&#39;。
Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateArgumentCallSites(类型serviceType,类型implementationType,ISet callSiteChain,ParameterInfo []参数,bool throwIfCallSiteNotFound)
上面是我给出的错误,这里是TestCaseManager类
public class TestCaseManager
{
protected internal TestCaseStore<TestCaseModel> m_store { get; set; }
protected virtual CancellationToken m_cancellationToken => CancellationToken.None;
public virtual IQueryable<TestCaseModel> TestCases
{
get
{
var queryableStore = m_store as IQueryableTestCaseStore<TestCaseModel>;
if (queryableStore == null)
throw new NotSupportedException("StoreNotIQueryableUserStore");
return queryableStore.TestCases;
}
}
public TestCaseManager(TestCaseStore pStore) => m_store = pStore;
}
public class TestCaseStore : TestCaseStore<TestCaseModel>
{
public TestCaseStore(DbContext pContext) : base(pContext) { }
}
public class TestCaseStore<TTestCase> : TestCaseStore<TTestCase, DbContext, string>
where TTestCase : TestCaseModel<string>
{
public TestCaseStore(DbContext pContext) : base(pContext) { }
}
public class TestCaseStore<TTestCase, TContext> : TestCaseStore<TTestCase, TContext, string>
where TTestCase : TestCaseModel<string>
where TContext : DbContext
{
public TestCaseStore(TContext pContext) : base(pContext) { }
}
public class TestCaseStore<TTestCase, TContext, TKey> : BaseDataStore<TTestCase, TContext, TKey>
where TTestCase : TestCaseModel<TKey>
where TContext : DbContext
where TKey : IEquatable<TKey>
{
public TestCaseStore(TContext pContext) : base(pContext) { }
}
答案 0 :(得分:2)
要构建类型为TestCaseManager
的服务,需要将TestCaseStore<TestCaseModel>
传递给其构造函数。你错过了你的服务。例如:
services.AddSingleton<TestCaseStore<TestCaseModel>>();
注意,如果TestCaseStore
需要和服务本身,它们也需要注册。