[英]castle windsor registering service and implementation only where implementation is not abstract or interface
我在域中的所有服務及其接口都在一個項目中,而在另一個項目中。 我使用以下代碼注冊程序集:
public IWindsorContainer SetupWithWebRequest()
{
return Generate(c => c.LifestylePerWebRequest());
}
public WindsorContainer SetupWithThread()
{
return Generate(c => c.LifestylePerThread());
}
private WindsorContainer Generate(Action<ComponentRegistration> reg)
{
var container = new WindsorContainer();
var types = new List<FromAssemblyDescriptor>();
types.Add(Types.FromAssembly(typeof(BlogRepository).Assembly));
types.Add(Types.FromAssembly(typeof(BlogEntryService).Assembly));
foreach (var type in types)
{
container.Register(type.Pick().WithServiceAllInterfaces().Configure(reg));
}
//ensure the db context is passed in.
container.Register(Component.For<IUserRepository<BlogUserEntity, int>>().LifeStyle.PerWebRequest.UsingFactoryMethod(() => new GenericUserRepository<BlogUserEntity, int>(new BlogEngineContext())));
return container;
}
上面的代碼將注冊許多我不感興趣的東西。 例如,所有IDisposable。 這可能不是問題,難道不知道這是否會減慢速度嗎? 我的主要問題是我在域層中定義了一個接口,但在網站中實現了該接口。
上面的代碼在域DLL中,並從網站(global.asax)調用,如下所示:
var container = new WindsorContainerGeneration().SetupWithWebRequest();
container.RegisterControllers(Assembly.GetExecutingAssembly());
//setup the website to get its user from aspnet.
container.Register(Component.For<IGetCurrentUserName>().LifeStyle.PerWebRequest.ImplementedBy(typeof(GetCurrentUserNameUsingAspnet)));
GlobalConfiguration.Configuration.DependencyResolver = new WindsorDependencyResolver(container);
ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory(container));
即使我手動注冊了IGetCurrentUserName實例,該容器也已經注冊了一個實例,其中服務和實現都是接口。
有沒有辦法確保只有實現接口的類才被注冊而不是在上面?
您可以使用types.BasedOn<IInterfaceName>()
篩選僅實現特定接口的類。
如果只想過濾實現任何接口的類,則可以使用以下方法:
types.Where(type => type.GetInterfaces().Any()
這是一個示例實現:
protected virtual IEnumerable<IRegistration> GetComponentRegistrations()
{
return new IRegistration[]
{
Classes.FromAssembly(GetAssemblyNamed(MyAssembly))
.BasedOn<IMyComponent>()
.If(x => x.IsContructable()) // this is it
.WithServiceDefaultInterfaces()
};
}
public static class TypeHelpers
{
public static bool IsContructable(this Type t)
{
return !t.IsAbstract && !t.ContainsGenericParameters;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.