2009-08-17 34 views
1

我使用Bojan Resnik在this question中描述的方法来解析未在Windsor容器中注册的类的实例。问题是我不希望这些类作为“服务”提供给其他已解决的实例。Castle IoC - 如何防止注册组件被解析为依赖关系?

例如,给出以下类:

class Order 
{ 
    public Order(ITaxCalculator tc) 
    { 
     // ... 
    } 
} 

class SomeOtherThing 
{ 
    public SomeOtherThing(ISomeOtherService sos) 
    { 
     // ... 
    } 

    Order CurrentOrder 
    { 
     get; 
     set; 
    } 
} 

static class WindsorExtensions 
{ 
    public static object Create(this IWindsorContainer container, Type type) 
    { 
     if (!type.IsClass) 
     { 
      throw new ArgumentException("not class", "type"); 
     } 

     if (!container.Kernel.HasComponent(type)) 
     { 
      container.Kernel.AddComponent(type.FullName, type, LifestyleType.Transient); 
     } 

     return container.Resolve(type); 
    } 

    public static T Create<T>(this IWindsorContainer container) 
    { 
     return (T)ResolveType(container, typeof(T)); 
    } 
} 

我希望能够说:

Order order = container.Create<Order>(); 
SomeOtherThing thing = container.Create<SomeOtherThing>(); 

但我不想订购的新实例获得注入到SomeOtherThing的CurrentOrder属性。基本上,我希望容器创建实例,以便可以注入依赖关系,但我不希望这些类可用于注入其他类。

为了达到这个目标,我不介意为容器写额外的扩展名,只要有人能指出我正确的方向。

回答

0

默认情况下,windsor在属性注入时使用构造函数注入。由于这个CurrentOrder永远不会被注入SomeOtherThing类,除非将它添加到构造函数中。

看着你的代码,你基本上迟到了将组件注册到容器中。如果你想确定它从未被注入过,你可以在它解决了之后将它移除,例如。

static class WindsorExtensions 
{ 
public static object Create(this IWindsorContainer container, Type type) 
{ 
    if (!type.IsClass) 
    { 
     throw new ArgumentException("not class", "type"); 
    } 
    if (!container.Kernel.HasComponent(type)) 
    { 
     container.Kernel.AddComponent(type.FullName, type, LifestyleType.Transient); 
    } 
    object instance = container.Resolve(type); 
    container.Kernel.RemoveComponent(type.FullName); 
    return instance; 

} 

public static T Create<T>(this IWindsorContainer container) 
{ 
    return (T)ResolveType(container, typeof(T)); 
} 
} 
1

我觉得,因为它使用了“未登记”成分的孩子内核this workaround将解决您的问题,所以它应该不会影响其他组件。

相关问题