2016-09-14 3 views
2

Я пытаюсь использовать функцию Unity Registration by Convention. Я не могу понять, как зарегистрироваться из определенных файлов сборки/проекта с файлом, заканчивающимся «Репозиторий».Unity DI авторегистрация с конкретной сборки

container.RegisterTypes(
     AllClasses.FromAssembliesInBasePath(), 
     WithMappings.FromMatchingInterface, 
     WithName.Default, 
     WithLifetime.ContainerControlled); 

Я нашел только этот пример из блога MSDN (https://blogs.msdn.microsoft.com/agile/2013/03/12/unity-configuration-registration-by-convention/) поста и, как я понимаю, это будет поиском по всем проектам/сборки и будет искать имена по умолчанию конвенции файлов класс и IClass.

У меня есть проект в моем решении с именем CManager.Repository с файлами репозитория, заканчивающимися на * Репозиторий. Они автоматически зарегистрированы.

Любой намек или помощь?

+0

Можете ли вы предоставить ссылку на сообщение в блоге, на которое вы ссылаетесь? – Necoras

+0

Я добавил ulr в сообщение в блоге –

+0

Вы имеете в виду классы, чье имя заканчивается на «Репозиторий», правильно? У вас есть ссылки на проект «CManager.Repository» из корневого проекта композиции (проект, в котором вы используете Unity)? –

ответ

1

Для автоматической регистрации единства, лучше отделить Interfaces и Repositories как папка в хранилище проекта с правильной именовании.
enter image description here

Если у вас есть все репозиториев под одного проекта, то это не требуется для сканирования всех сборок. Это должно зарегистрировать все хранилища в рамках проекта CManager.Repository

public static class UnityConfig 
    { 
    public static void RegisterComponents() 
     { 
     var container = new UnityContainer(); 
     var repositoryAssembly = AppDomain.CurrentDomain.GetAssemblies() 
      .First(a => a.FullName == "CManager.Repository, Version=X.X.X.X, Culture=neutral, PublicKeyToken=null"); 

     container.RegisterTypes(repositoryAssembly.GetTypes(), 
      WithMappings.FromMatchingInterface, 
      WithName.Default, 
      WithLifetime.ContainerControlled);  

     container.RegisterType<ApplicationDbContext>(new PerResolveLifetimeManager()); 
     // ................ register other things is needed 
     DependencyResolver.SetResolver(new UnityDependencyResolver(container)); 
    } 
    } 

мы должны зарегистрировать компоненты единства по применению запуска, традиционно внутри Global.asax.cs файла. Так что положил UnityConfig.cs файл при запуске проекта под App_Start папка.

public class MvcApplication : HttpApplication 
{ 
    protected void Application_Start() 
    { 
     UnityConfig.RegisterComponents(); 
     AreaRegistration.RegisterAllAreas(); 
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
     BundleConfig.RegisterBundles(BundleTable.Bundles);    
    }  
} 

и убедитесь, что другие проекты связана с проектом запуска.

+0

У меня такая архитектура решения. Уровень веб-представления. База данных - это где я реализую контекст. Entity - где хранятся все сущности. Репозиторий - репозиторий. Core - в основном bll.Инфраструктура - это слой, где я реализую единство DI. Так что, если я хочу, чтобы авторегистрация была репо, как должен выглядеть код? –

+0

Я обновил свой ответ. –

+0

My DI настроен и работает. Я не могу сделать работу авторегистра. Веб связан с инфраструктурой. Вопрос заключается в том, как сканировать из конкретной сборки для определенных классов. –

-2

Это работает для меня на веб-сервере предприятия, над которым я работаю уже несколько месяцев. Он имеет n-уровневую архитектуру с уровнем данных, который имеет .cs-файлы, которые заканчиваются на «репозиторий». Хотя я согласен с другим сообщением, Интерфейсы должны быть разделены, в моем веб-api они не реализованы таким образом.

using System; 
using System.Web.Http; 
using Microsoft.Practices.Unity; 
using Microsoft.Practices.Unity.Configuration; 
using Unity.WebApi; 

namespace Blah.Endpoints.App_Start 
{ 
    /// <summary> 
    /// Specifies the Unity configuration for the main container. 
    /// </summary> 
    public static class UnityConfig 
    { 
     public static void RegisterComponents() 
     { 
      var container = new UnityContainer(); 

      // register all your components with the container here 
      // it is NOT necessary to register your controllers 
      RegisterTypes(container); 
      // e.g. container.RegisterType<ITestService, TestService>(); 

      GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container); 
     } 

     #region Unity Container 
     private static Lazy<IUnityContainer> container = new Lazy<IUnityContainer>(() => 
     { 
      var container = new UnityContainer(); 
      RegisterTypes(container); 
      return container; 
     }); 

     /// <summary> 
     /// Gets the configured Unity container. 
     /// </summary> 
     public static IUnityContainer GetConfiguredContainer() 
     { 
      return container.Value; 
     } 
     #endregion 

     /// <summary>Registers the type mappings with the Unity container.</summary> 
     /// <param name="container">The unity container to configure.</param> 
     /// <remarks>There is no need to register concrete types such as controllers or API controllers (unless you want to 
     /// change the defaults), as Unity allows resolving a concrete type even if it was not previously registered.</remarks> 
     public static void RegisterTypes(IUnityContainer container) 
     { 

      container.RegisterTypes(AllClasses.FromLoadedAssemblies(), 
       WithMappings.FromMatchingInterface, 
       WithName.Default, 
       null,    //WithLifetime IF we want to change the lifetime aspect aka Singletons 
       null,//GetMembers, 
       false 
       ); 
     } 


    } 
} 

Эта настройка обычно работает для моей команды. Иногда мы все еще получаем классы, которые бросают ошибки единства без всякой видимой причины. Для тех мы делаем что-то подобное;

public class WcfServiceFactory : UnityServiceHostFactory 
    { 
     protected override void ConfigureContainer(IUnityContainer container) 
     { 
      //Attach hook for AOP attributes 
      container.AddNewExtension<Interception>(); 

      // register all your components with the container here 
      // container 
      // .RegisterType<IService1, Service1>() 
      // .RegisterType<DataContext>(new HierarchicalLifetimeManager()); 

      container.RegisterTypes(AllClasses.FromLoadedAssemblies(), 
       WithMappings.FromMatchingInterface, 
       WithName.Default, 
       null,    //WithLifetime IF we want to change the lifetime aspect aka Singletons 
       GetMembers, 
       false 
       ); 

      container.RegisterType<IPaymentService, PaymentService>(); 
      container.RegisterType<IPaymentManager, PaymentManager>(); 
      container.RegisterType<IPaymentMethodRepository, PaymentMethodRepository>(); 
      container.RegisterType<IPaymentWithdrawScheduleRepository, PaymentWithdrawScheduleRepository>(); 
      container.RegisterType<IPaymentPreEnrollmentRepository, PaymentPreEnrollmentRepository>(); 
      container.RegisterType<ISharedLoanDataRepository<tblPaymentMethod>, SharedLoanDataRepository<tblPaymentMethod>>(); 
      container.RegisterType<ISharedLoanDataRepository<tblPaymentWithdrawSchedule>, SharedLoanDataRepository<tblPaymentWithdrawSchedule>>(); 
      container.RegisterType<IPaymentWithdrawScheduleOffSetTypeRepository, PaymentWithdrawScheduleOffSetTypeRepository>(); 
      container.RegisterType<IPaymentMethodTypeRepository, PaymentMethodTypeRepository>(); 
      container.RegisterType<IPaymentWithdrawScheduleFrequencyTypeRepository, PaymentWithdrawScheduleFrequencyTypeRepository>(); 
      container.RegisterType<IPaymentCustomerNotificationRepository, PaymentCustomerNotificationRepository>(); 
      container.RegisterType<ITraceLogger, TraceLogger>(); 
      container.RegisterType<IPaymentWithdrawScheduleCancelReasonRepository, PaymentWithdrawScheduleCancelReasonRepository>(); 
     } 

     private IEnumerable<InjectionMember> GetMembers(Type type) 
     { 
      var list = new List<InjectionMember>(); 
      list.Add(new InterceptionBehavior<PolicyInjectionBehavior>(type.ToString())); 
      list.Add(new Interceptor<InterfaceInterceptor>(type.ToString())); 
      return list; 
     } 
    } 

Я надеюсь, что это помогает

С уважением.

Смежные вопросы