我的所有服务及其域的接口都在一个项目中,存储库在另一个项目中。我使用以下代码注册程序集:
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的实例,容器也已经注册了一个实例,其中服务和实现都是接口。
有没有办法确保只有实现接口的类才能注册而不是上面?
答案 0 :(得分:1)
您只能使用types.BasedOn<IInterfaceName>()
如果您只想过滤到实现任何接口的类,您可以使用它:
types.Where(type => type.GetInterfaces().Any()
答案 1 :(得分:0)
以下是一个示例实现:
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;
}
}