如何将参数添加到控制器构造函数

时间:2018-04-19 16:00:07

标签: c# asp.net-core

美好的一天,

我正在尝试在控制器构造函数中实现一个参数,但我无法理解如何实现这一点。

在我的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) { }
    }

1 个答案:

答案 0 :(得分:2)

要构建类型为TestCaseManager的服务,需要将TestCaseStore<TestCaseModel>传递给其构造函数。你错过了你的服务。例如:

services.AddSingleton<TestCaseStore<TestCaseModel>>();

注意,如果TestCaseStore需要和服务本身,它们也需要注册。