2017-07-05 79 views
1

我有一個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容器中。 任何想法,爲什麼我得到這個異常?

+0

你需要 – Nkosi

+1

文檔這裏登記對象圖中所有的依賴 - https://docs.microsoft.com/en-us/aspnet/核心/基礎/依賴注入 – Nkosi

+0

我無法使用'AddDbContext ()'方法是否正常?許多其他人工作正常,但我不能爲這個,甚至''AddMvc()' –

回答

1

這是相當簡單,採用正由你做的運行時間傳遞給ConfigureServices方法IServiceCollection例如:

services.AddSingleton<IAbstraction, ConcreteImplementation>(); 

,或者對於一個短暫的一生範圍:

services.AddTransient<IAbstraction, ConcreteImplementation>(); 

,或者在你的情況下:

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

這不起作用我不知道爲什麼,這是我遇到的解決方案,但我一直得到空引用異常 –

+0

@LéonardLaiter如何試圖注入依賴關係? – Alex

+0

我相信這是我跳過的步驟:p閱讀@Nkosi發佈的文檔,當我到達時,我會告訴您。 –

1

我不會打電話裏面的服務artup。

將您的IGenericService作爲私有隻讀實例,然後創建構造函數以在startup.cs中調用,或者您決定使用它的位置。

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

現在你罵你的類,如:

GenericService.Method();