2016-09-14 34 views
2

ConventionによるUnity Registration機能を使用しようとしています。 特定のアセンブリ/プロジェクトファイルから「リポジトリ」で終わるファイルを登録する方法がわかりません。特定のアセンブリからの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/)ポストからのみ、この例を見つけたと私はそれを理解するように、これはすべてのプロジェクト/アセンブリを検索し、デフォルトの命名規則ファイルクラスとiクラスを探します。

私のソリューションには、* Repositoryで終わるリポジトリファイルを持つCManager.Repositoryというプロジェクトがあります。それらは自動登録されています。

ヒントやヘルプはありますか?

+0

参照しているブログ投稿へのリンクを提供できますか? – Necoras

+0

ブログ投稿にulrを追加しました –

+0

名前がRepositoryで終わるクラスを意味します。コンポジションルートプロジェクト(Unityを使用するプロジェクト)からの "CManager.Repository"プロジェクトの参照はありますか? –

答えて

1

は団結の自動登録にとっては、適切な命名規則でリポジトリプロジェクトにフォルダとしてInterfacesRepositoriesを分離する方が良いでしょう。
enter image description here

あなたは、単一のプロジェクトの下、すべてのリポジトリを持っている場合、すべてのアセンブリをスキャンするために必要ではないです。これは、私たちが伝統的にGlobal.asax.csファイル内で、アプリケーション起動時に統一コンポーネントを登録する必要がプロジェクトの下のすべてのリポジトリ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)); 
    } 
    } 

を登録する必要があります。したがって、スタートアッププロジェクトのファイルを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

私はそのようなソリューションアーキテクチャを持っています。 Web表現レイヤー。データベース - 私はコンテキストを実装しています。エンティティ - すべてのエンティティが格納されます。リポジトリ - 実装されたリポジトリ。コア - 基本的にbll。インフラストラクチャ - これは、単一性DIを実装するレイヤーです。だから私は、自動登録のレポをしたい場合、どのようにコードのように見える必要がありますか? –

+0

私は自分の答えを更新しました。 –

+0

私のDIが設定され、動作しています。私は自動登録作業を行うことができません。 Webはインフラストラクチャにリンクされています。問題は、特定のクラスの特定のアセンブリからスキャンする方法です –

-2

これは私が今数ヶ月にわたって取り組んできたエンタープライズウェブAPIで私の仕事です。これは、データファイル層が「Repository」で終わる.csファイルを持つn層アーキテクチャを備えています。私は他のポストに同意しますが、インタフェースは分離していなければなりません。私のweb-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; 
     } 
    } 

私は、これは

よろしくに役立ちます願っています。

関連する問題