castle windsor仅在实现不是抽象或接口的情况下注册服务和实现

时间:2015-03-21 14:02:36

标签: c# dependency-injection castle-windsor

我的所有服务及其域的接口都在一个项目中,存储库在另一个项目中。我使用以下代码注册程序集:

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的实例,容器也已经注册了一个实例,其中服务和实现都是接口。

有没有办法确保只有实现接口的类才能注册而不是上面?

2 个答案:

答案 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;
        }
    }
相关问题