如何在 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();