これは私が今数ヶ月にわたって取り組んできたエンタープライズウェブ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;
}
}
私は、これは
よろしくに役立ちます願っています。
参照しているブログ投稿へのリンクを提供できますか? – Necoras
ブログ投稿にulrを追加しました –
名前がRepositoryで終わるクラスを意味します。コンポジションルートプロジェクト(Unityを使用するプロジェクト)からの "CManager.Repository"プロジェクトの参照はありますか? –