2015-11-12 70 views
0

我的配置,我需要註冊兩個控制器,只是:簡單的注射器:註冊收藏時壓倒一切的生活方式?

public class DataApiController : ApiController 
{ 
    readonly Data _data; 
    readonly MongoRepo _mongoRepo; 
    readonly JobManager _jobManager; 
    readonly QueueManager _queueManager; 

    public DataApiController(QueueManager queueManager, 
     MongoRepo mongoRepo, JobManager jobManager, Data data) 
    { 
     _queueManager = queueManager; 
     _mongoRepo = mongoRepo; 
     _jobManager = jobManager; 
     _data = data; 
    } 

    ...   
} 

,另一個也使用ApiController。我需要將它們註冊爲一個集合,我做的正是如此:

var types = new[] { typeof(DataApiController), typeof(BatchApiController) }; 
container.RegisterCollection<ApiController>(
    from type in types 
    select Lifestyle.Transient.CreateRegistration(type, container)); 

雖然這工作,我得到的錯誤,所需要的瞬態設置是錯誤的,因爲IDisposable。 OK,我得到的,我看到,有登記的單個項目時讓周圍一個例子:

public static void RegisterDisposableTransient<TService, TImplementation>(
    this Container container) 
    where TImplementation : class, IDisposable, TService 
    where TService : class 
{ 
    var scoped = Lifestyle.Scoped; 
    var reg = Lifestyle.Transient.CreateRegistration<TService, TImplementation>(container); 
    reg.SuppressDiagnosticWarning(DiagnosticType.DisposableTransientComponent, 
    "suppressed."); 
    container.AddRegistration(typeof(TService), reg); 
    container.RegisterInitializer<TImplementation>(
     o => scoped.RegisterForDisposal(container, o)); 
} 

有沒有覆蓋的錯誤抑制的收藏?我無法得到任何可以抑制診斷警告的工作,就像容器被驗證時那樣被忽略,並且我總是收到有關Transient和IDisposable的錯誤/警告。我怎樣才能註冊一個集合,讓容器知道我得到它,我需要壓制這個錯誤?註冊上面的RegisterDisposableTransient的單個API控制器可以正常工作,但由於一個服務上有兩個實現,因此我需要使用該集合。

+1

你如何解決控制器的集合:

如果這兩個ApiControllers不使用RegisterWebApiControllers(也許是因爲他們在不同的組件),下面會做的伎倆,以及註冊? – qujck

回答

2

只要做到以下,一切都應該很好地工作:

container.RegisterWebApiControllers(GlobalConfiguration.Configuration); 

container.RegisterCollection<ApiController>(new[] { 
    typeof(DataApiController), typeof(BatchApiController) 
}); 

這將工作的原因是因爲:

  • RegisterWebApiControllers將註冊所有與Transient生活方式應用程序的控制器(通過其具體類型),並會對該註冊添加抑制。
  • Simple Injector將使用RegisterCollection將註冊的任何(具體)類型轉發回容器,並且它將重新使用任何現有的註冊。

這導致DataApiControllerBatchApiController重新使用(使用RegisterWebApiControllers註冊),包括他們的鎮壓現有註冊。

var r1 = Lifestyle.Transient.CreateRegistration<DataApiController>(container); 
r1.SuppressDiagnosticWarning(DiagnosticType.DisposableTransientComponent, 
    "done by web api"); 

container.AddRegistration(typeof(DataApiController), r1); 

var r2 = Lifestyle.Transient.CreateRegistration<BatchApiController>(container); 
r2.SuppressDiagnosticWarning(DiagnosticType.DisposableTransientComponent, 
    "done by web api"); 

container.AddRegistration(typeof(BatchApiController), r2); 

container.RegisterCollection<ApiController>(new[] { 
    typeof(DataApiController), typeof(BatchApiController) 
}); 
+0

什麼解決了我(經過數小時的嘗試)實際上是我登記一切的順序。我正在構建容器並添加註冊(包括集合),然後註冊WebApi控制器。我認識到註冊會做到這一點,但沒有直覺的人。謝謝。 – BryanGrimes

相關問題