我有一個ASP.Net MVC 5項目使用洋蔥架構,我有存儲庫和服務,並使用我的控制器提供的服務。在我的控制器中,我需要使用我創建的IGenericService
變量,但是如何實例化這些變量?問題是我的服務需要構造函數IRepository
,並且IRepository
也需要初始化。我如何實例化MVC中的服務
我在Startup.cs
文件中的方法ConfigureServices(IServiceCollection services)
中嘗試的是AddSingleton(IGenericService<MyClass>, GenericService<MyClass>)
,但它似乎沒有幫助。
編輯建議我的@Nkosi我試圖解決依賴關係,並遵循本教程這樣做:http://scottdorman.github.io/2016/03/17/integrating-asp.net-core-dependency-injection-in-mvc-4/。我現在的問題是,我得到一個invalid operation exception
:
無法在嘗試激活「WebExploitv2.Controllers.NavigationController」
我startup.cs貌似解決了類型「Repository.PrincipalServerContext」服務這個現在:
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
var services = new ServiceCollection();
ConfigureAuth(app);
ConfigureServices(services);
var resolver = new DefaultDependencyResolver(services.BuildServiceProvider());
DependencyResolver.SetResolver(resolver);
}
public void ConfigureServices(IServiceCollection services)
{
services.AddControllerAsServices(typeof(Startup).Assembly.GetExportedTypes()
.Where(t => !t.IsAbstract && !t.IsGenericTypeDefinition)
.Where(t => typeof(IController).IsAssignableFrom(t)
|| t.Name.EndsWith("Controller", StringComparison.OrdinalIgnoreCase)));
services.AddSingleton<IGenericRepository<Web_Documents>, GenericRepository<Web_Documents>>();
services.AddSingleton<IGenericService<Web_Documents>, GenericService<Web_Documents>>();
services.AddSingleton<IGenericRepository<Web_Categories>, GenericRepository<Web_Categories>>();
services.AddSingleton<IGenericService<Web_Categories>, GenericService<Web_Categories>>();
services.AddSingleton<IGenericService<Web_User_joint_Profils>, GenericService<Web_User_joint_Profils>>();
services.AddSingleton<IGenericRepository<Web_User_joint_Profils>, GenericRepository<Web_User_joint_Profils>>();
services.AddSingleton<IGenericRepository<Web_Group_joint_Profils>, GenericRepository<Web_Group_joint_Profils>>();
services.AddSingleton<IGenericService<Web_Group_joint_Profils>, GenericService<Web_Group_joint_Profils>>();
services.AddSingleton<IMenuService, MenuService>();
services.AddSingleton<IMenuRepository, MenuRepository>();
}
}
我還添加了DefaultDependencyResolver
類:
public class DefaultDependencyResolver : IDependencyResolver
{
protected IServiceProvider serviceProvider;
public DefaultDependencyResolver(IServiceProvider serviceProvider)
{
this.serviceProvider = serviceProvider;
}
public object GetService(Type serviceType)
{
return this.serviceProvider.GetService(serviceType);
}
public IEnumerable<object> GetServices(Type serviceType)
{
return this.serviceProvider.GetServices(serviceType);
}
}
接下來我有ServiceProviderExtension
類:
public static class ServiceProviderExtensions
{
public static IServiceCollection AddControllerAsServices(this IServiceCollection services, IEnumerable<Type> controllerTypes)
{
foreach(var type in controllerTypes)
{
services.AddTransient(type);
}
return services;
}
}
最後,在我的控制,我有GenericService
接口,讓我訪問Repository
並依次訪問我的數據庫。我用的是遵循接口的實例
private IGenericService<Web_User_joint_Profils> _userProfileService;
private IGenericService<Web_Group_joint_Profils> _groupProfileService;
private IGenericService<Web_Categories> _categoryService;
PrincipalServerContext context;
private NavigationController(PrincipalServerContext context, IGenericService<Web_User_joint_Profils> userProfileService, IGenericService<Web_Group_joint_Profils> groupProfileService, IGenericService<Web_Categories> categoryService)
{
_context = context;
_userProfileService = userProfileService;
_groupProfileService = groupProfileService;
_categoryService = categoryService;
}
注意,我GenericService
需要波蘇斯泛型爲了知道到哪裏尋找數據庫中。因此,對於Startup.ConfigureServices(IServiceCollection services)
中的每一個,我都添加了一個AddSingleton
方法來將這些服務和存儲庫註冊到DI容器中。 任何想法,爲什麼我得到這個異常?
你需要 – Nkosi
文檔這裏登記對象圖中所有的依賴 - https://docs.microsoft.com/en-us/aspnet/核心/基礎/依賴注入 – Nkosi
我無法使用'AddDbContext()'方法是否正常?許多其他人工作正常,但我不能爲這個,甚至''AddMvc()' –