ForeignlyOwned() не работает на уровне сканирования сборки? ⇐ C#
-
Anonymous
ForeignlyOwned() не работает на уровне сканирования сборки?
У меня есть следующие классы внутри сборки AutofacDotMemory
публичный интерфейс IOutput:IDisposable { void Write (содержимое строки); } общедоступный класс ConsoleOutput: IOutput { public void Write(строковое содержимое) { Console.WriteLine(содержимое); } публичная недействительность Dispose() { // Здесь TODO высвобождает управляемые ресурсы } } общедоступный интерфейс IDateWriter:IDisposable { недействительный WriteDate(); } открытый класс TodayWriter: IDateWriter { частный IOutput _output; public TodayWriter (выход IOutput) { this._output = вывод; } публичная недействительность WriteDate() { this._output.Write(DateTime.Today.ToShortDateString()); } публичная недействительность Dispose() { // Здесь TODO высвобождает управляемые ресурсы } } И в другой моей тестовой сборке я также упомянул Autofac и пытаюсь использовать ExternallyOwned на уровне сканирования сборки со следующим тестовым кодом:
[Тест] общественная недействительность ExternallyOwnedTest() { вар строитель = новый ContainerBuilder(); builder.RegisterAssemblyTypes(typeof(IDateWriter).Assembly) .ExternallyOwned(); builder.RegisterType().As(); builder.RegisterType().As(); вар контейнер = builder.Build(); регистрация var =Container.ComponentRegistry.TryGetRegistration(new TypedService(typeof(IDateWriter)), out var FoundRegistration); TestContext.WriteLine(регистрация); вар isExternallyOwned = регистрация && FoundRegistration.Ownership == InstanceOwnership.ExternallyOwned; Assert.IsTrue(isExternallyOwned, $"{nameof(TodayWriter)} не принадлежит внешнему владельцу"); контейнер.Dispose(); } И тест не прошёл, потому что TodayWriter не принадлежит внешнему владельцу.
Но если я изменю регистрационный код на приведенный ниже, чтобы это выполнялось для каждого типа регистрации:
var builder = новый ContainerBuilder(); builder.RegisterType().As(); builder.RegisterType().As().ExternallyOwned(); //теперь это работает вар контейнер = builder.Build(); регистрация var =Container.ComponentRegistry.TryGetRegistration(new TypedService(typeof(IDateWriter)), out var FoundRegistration); TestContext.WriteLine(регистрация); вар isExternallyOwned = регистрация && FoundRegistration.Ownership == InstanceOwnership.ExternallyOwned; Assert.IsTrue(isExternallyOwned, $"{nameof(TodayWriter)} не принадлежит внешнему владельцу"); контейнер.Dispose(); И теперь этот тест пройден, поскольку TodayWriter принадлежит внешнему пользователю.
Как гарантировать, что все типы в данной сборке (или, по крайней мере, большинство типов, на которые распространяется условие фильтра Where) зарегистрированы как externallyOwned? Я не хочу просматривать весь зарегистрированный тип и добавлять туда ключевое слово ForeignlyOwned.
У меня есть следующие классы внутри сборки AutofacDotMemory
публичный интерфейс IOutput:IDisposable { void Write (содержимое строки); } общедоступный класс ConsoleOutput: IOutput { public void Write(строковое содержимое) { Console.WriteLine(содержимое); } публичная недействительность Dispose() { // Здесь TODO высвобождает управляемые ресурсы } } общедоступный интерфейс IDateWriter:IDisposable { недействительный WriteDate(); } открытый класс TodayWriter: IDateWriter { частный IOutput _output; public TodayWriter (выход IOutput) { this._output = вывод; } публичная недействительность WriteDate() { this._output.Write(DateTime.Today.ToShortDateString()); } публичная недействительность Dispose() { // Здесь TODO высвобождает управляемые ресурсы } } И в другой моей тестовой сборке я также упомянул Autofac и пытаюсь использовать ExternallyOwned на уровне сканирования сборки со следующим тестовым кодом:
[Тест] общественная недействительность ExternallyOwnedTest() { вар строитель = новый ContainerBuilder(); builder.RegisterAssemblyTypes(typeof(IDateWriter).Assembly) .ExternallyOwned(); builder.RegisterType().As(); builder.RegisterType().As(); вар контейнер = builder.Build(); регистрация var =Container.ComponentRegistry.TryGetRegistration(new TypedService(typeof(IDateWriter)), out var FoundRegistration); TestContext.WriteLine(регистрация); вар isExternallyOwned = регистрация && FoundRegistration.Ownership == InstanceOwnership.ExternallyOwned; Assert.IsTrue(isExternallyOwned, $"{nameof(TodayWriter)} не принадлежит внешнему владельцу"); контейнер.Dispose(); } И тест не прошёл, потому что TodayWriter не принадлежит внешнему владельцу.
Но если я изменю регистрационный код на приведенный ниже, чтобы это выполнялось для каждого типа регистрации:
var builder = новый ContainerBuilder(); builder.RegisterType().As(); builder.RegisterType().As().ExternallyOwned(); //теперь это работает вар контейнер = builder.Build(); регистрация var =Container.ComponentRegistry.TryGetRegistration(new TypedService(typeof(IDateWriter)), out var FoundRegistration); TestContext.WriteLine(регистрация); вар isExternallyOwned = регистрация && FoundRegistration.Ownership == InstanceOwnership.ExternallyOwned; Assert.IsTrue(isExternallyOwned, $"{nameof(TodayWriter)} не принадлежит внешнему владельцу"); контейнер.Dispose(); И теперь этот тест пройден, поскольку TodayWriter принадлежит внешнему пользователю.
Как гарантировать, что все типы в данной сборке (или, по крайней мере, большинство типов, на которые распространяется условие фильтра Where) зарегистрированы как externallyOwned? Я не хочу просматривать весь зарегистрированный тип и добавлять туда ключевое слово ForeignlyOwned.
Мобильная версия