2016-09-18 360 views
0

我正在嘗試將業務邏輯實現注入到Web API基礎控制器中。不知何故,基本控制器中的屬性始終爲nullAutofac惰性屬性注入

另外我該如何做懶惰注射?

Startups.cs

public IServiceProvider ConfigureServices(IServiceCollection services) 
{ 
    // Add framework services. 
    services.AddMvc(); 

    var containerBuilder = new ContainerBuilder(); 
    containerBuilder.RegisterType<ViewBusinessLogic>().As<IViewBusinessLogic>(). 
     PropertiesAutowired(); 
    containerBuilder.Populate(services); 

    var container = containerBuilder.Build(); 

    return container.Resolve<IServiceProvider>(); 
} 

接口,實現和基本控制器:

public interface IViewBusinessLogic 
{ 
    IEnumerable<dynamic> GetView(Guid viewId); 
} 

public class ViewBusinessLogic : BusinessLogic, IViewBusinessLogic 
{ 
    public IEnumerable<dynamic> GetView(Guid viewId) 
    { 
     return new List<dynamic> 
     { 
      new { Test = "Test1" }, 
      new { Test = "Test2" } 
     }; 
    } 
} 

public abstract class BaseController : Controller 
{ 
    public IViewBusinessLogic ViewBusinessLogic { get; } 
} 
+0

**這不是一個Autofac問題,它是一個ASP.NET Core問題。**如果沒有'AddControllersAsServices',任何其他DI提供程序都無法使用屬性注入 - 因此我的標題編輯。由於標題不正確而拒絕更新爲更準確的標題而降低了問題。 –

回答

1

控制器不是默認由DI框架解決。您需要添加AddControllerAsServices以使其由您選擇的DI解決。

this GitHub issue

嗨,

也許我錯了,但我深深的測試(和檢查的mvc源代碼),控制器不從IServiceProvider解決,但只有構造函數的參數他們從IServiceProvider解決。

是由設計?我很驚訝。因爲我正在使用支持屬性注入的不同DI框架。而且我不能使用屬性注入,因爲Controller實例不是從IServiceProvider請求的。

你有沒有在你的啓動(https://github.com/aspnet/Mvc/blob/ab76f743f4ee537939b69bdb9f79bfca35398545/test/WebSites/ControllersFromServicesWebSite/Startup.cs#L37

上面的例子引述以供將來參考添加AddControllersAsServices

public void ConfigureServices(IServiceCollection services) 
{ 
    var builder = services 
     .AddMvc() 
     .ConfigureApplicationPartManager(manager => manager.ApplicationParts.Clear()) 
     .AddApplicationPart(typeof(TimeScheduleController).GetTypeInfo().Assembly) 
     .ConfigureApplicationPartManager(manager => 
     { 
      manager.ApplicationParts.Add(new TypesPart(
       typeof(AnotherController), 
       typeof(ComponentFromServicesViewComponent), 
       typeof(InServicesTagHelper))); 

      manager.FeatureProviders.Add(new AssemblyMetadataReferenceFeatureProvider()); 
     }) 

     // This here is important 
     .AddControllersAsServices() 
     .AddViewComponentsAsServices() 
     .AddTagHelpersAsServices(); 

    services.AddTransient<QueryValueService>(); 
    services.AddTransient<ValueService>(); 
    services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); 
} 

關於你問題的第二部分:我不認爲這是可能通過IoC容器有延遲實例化的。最適合你的是創建一個工廠類並注入工廠而不是具體的服務。

但是通常你不需要惰性實例化,服務的實例化應該是快速的。如果不是的話,你可能在構造函數中做了一些時髦的事情(連接某處,或者做其他長時間運行的操作),這是一種反模式。