如何在 MVC 中实例化服务



我有一个使用洋葱架构的 ASP.Net MVC 5项目,其中我有存储库和服务,并且我使用控制器中的服务。在我的控制器中,我需要使用我创建的IGenericService变量,但是如何实例化这些变量呢?问题是我的服务需要为其构造函数提供一个IRepository,反过来也需要初始化IRepository

我尝试的方法AddSingleton(IGenericService<MyClass>, GenericService<MyClass>)ConfigureServices(IServiceCollection services)Startup.cs文件中,但它似乎没有帮助。

编辑按照我的@Nkosi的建议,我正在尝试解决依赖关系并按照本教程进行操作:http://scottdorman.github.io/2016/03/17/integrating-asp.net-core-dependency-injection-in-mvc-4/.我现在的问题是我得到了一个invalid operation exception

尝试激活"WebExploitv2.Controllers.NavigationController"时无法解析类型"Repository.PrincipalServerContext"的服务

我的创业.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类:

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将 POCO 作为泛型,以便知道在数据库中查找的位置。因此,对于Startup.ConfigureServices(IServiceCollection services)中的每一个,我都添加了一个AddSingleton方法来向 DI 容器注册这些服务和存储库。 知道为什么我得到这个异常吗?

我不会在初创公司内部调用服务。

IGenericService实例化为私有只读,然后创建构造函数以调用startup.cs或您决定使用它的位置。

private readonly IGenericService _genericService = new GenericService();
public IGenericService GenericService
{
get{ return _genericService; }
set{ _genericService = value; }
}

现在,您可以像以下方式调用您的类:

GenericService.Method();

它相当简单,使用运行时传递给ConfigureServices方法IServiceCollection实例:

services.AddSingleton<IAbstraction, ConcreteImplementation>();

或者,对于瞬态生存期范围:

services.AddTransient<IAbstraction, ConcreteImplementation>();

或者,在您的情况下:

services.AddSingleton<IGenericService<MyClass>, GenericService<MyClass>>();

最新更新