如何在 MVC 中实例化服务
How can I instantiate Services in MVC
我有一个使用洋葱架构的 ASP.Net MVC 5 项目,其中我有存储库和服务,并且我使用控制器中的服务。在我的控制器中,我需要使用我创建的 IGenericService
变量,但如何实例化这些变量?问题是我的服务需要一个 IRepository
作为它的构造函数,反过来 IRepository
也需要初始化。
我在 Startup.cs
文件的方法 ConfigureServices(IServiceCollection services)
中尝试了 AddSingleton(IGenericService<MyClass>, GenericService<MyClass>)
,但它似乎没有帮助。
Edit 按照我的@Nkosi 的建议,我正在尝试解决依赖关系并按照本教程进行操作:http://scottdorman.github.io/2016/03/17/integrating-asp.net-core-dependency-injection-in-mvc-4/。我现在的问题是我得到一个 invalid operation exception
:
Unable to resolve service for type 'Repository.PrincipalServerContext' while attempting to activate 'WebExploitv2.Controllers.NavigationController'
我的 startup.cs 现在看起来像这样:
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
class :
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
class:
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;
}
请注意,My GenericService
将 POCO 作为泛型,以便知道在数据库中查找的位置。因此,对于 Startup.ConfigureServices(IServiceCollection services)
中的每一个,我添加了一个 AddSingleton
方法来将这些服务和存储库注册到 DI 容器。
知道为什么会出现此异常吗?
这很简单,使用在 运行 时传递给 ConfigureServices
方法的 IServiceCollection
实例:
services.AddSingleton<IAbstraction, ConcreteImplementation>();
或者,对于短暂的生命周期范围:
services.AddTransient<IAbstraction, ConcreteImplementation>();
或者,在您的情况下:
services.AddSingleton<IGenericService<MyClass>, GenericService<MyClass>>();
我不会在初创公司内部调用服务。
将您的 IGenericService
实例化为私有只读,然后创建构造函数以调用 startup.cs
或您决定使用它的任何地方。
private readonly IGenericService _genericService = new GenericService();
public IGenericService GenericService
{
get{ return _genericService; }
set{ _genericService = value; }
}
现在你称你的 类 为:
GenericService.Method();
我有一个使用洋葱架构的 ASP.Net MVC 5 项目,其中我有存储库和服务,并且我使用控制器中的服务。在我的控制器中,我需要使用我创建的 IGenericService
变量,但如何实例化这些变量?问题是我的服务需要一个 IRepository
作为它的构造函数,反过来 IRepository
也需要初始化。
我在 Startup.cs
文件的方法 ConfigureServices(IServiceCollection services)
中尝试了 AddSingleton(IGenericService<MyClass>, GenericService<MyClass>)
,但它似乎没有帮助。
Edit 按照我的@Nkosi 的建议,我正在尝试解决依赖关系并按照本教程进行操作:http://scottdorman.github.io/2016/03/17/integrating-asp.net-core-dependency-injection-in-mvc-4/。我现在的问题是我得到一个 invalid operation exception
:
Unable to resolve service for type 'Repository.PrincipalServerContext' while attempting to activate 'WebExploitv2.Controllers.NavigationController'
我的 startup.cs 现在看起来像这样:
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
class :
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
class:
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;
}
请注意,My GenericService
将 POCO 作为泛型,以便知道在数据库中查找的位置。因此,对于 Startup.ConfigureServices(IServiceCollection services)
中的每一个,我添加了一个 AddSingleton
方法来将这些服务和存储库注册到 DI 容器。
知道为什么会出现此异常吗?
这很简单,使用在 运行 时传递给 ConfigureServices
方法的 IServiceCollection
实例:
services.AddSingleton<IAbstraction, ConcreteImplementation>();
或者,对于短暂的生命周期范围:
services.AddTransient<IAbstraction, ConcreteImplementation>();
或者,在您的情况下:
services.AddSingleton<IGenericService<MyClass>, GenericService<MyClass>>();
我不会在初创公司内部调用服务。
将您的 IGenericService
实例化为私有只读,然后创建构造函数以调用 startup.cs
或您决定使用它的任何地方。
private readonly IGenericService _genericService = new GenericService();
public IGenericService GenericService
{
get{ return _genericService; }
set{ _genericService = value; }
}
现在你称你的 类 为:
GenericService.Method();