以下面的无用的程序:

class Program
{
    static void Main(string[] args)
    {
        IUnityContainer unityContainer = new UnityContainer();
        IWindsorContainer windsorContainer = new WindsorContainer();

        Program unityProgram = unityContainer.Resolve<Program>();
        Program castleProgram = windsorContainer.Resolve<Program>();
    }
}

在UnityContainer将返回我方案,其中作为容器温莎将抛出ComponentNotFoundException的一个实例。

我可以看到两者的行为参数和不介意,我结束了,但是棱镜V2下降8(最迟在写作的时间)内依靠团结的行为,请求尚未注册类。

而不是寻找和登记所有这些类棱镜我宁愿只是让温莎表现得像统一。我还没有找到任何谷歌帮我做到这一点(虽然我的术语可能是错误的)和温莎文档是相当糟糕...

任何人都可以提出一个解决这个问题?

有帮助吗?

解决方案

目前温莎不支持,它的设计。其理由是,你应该明确地注册,你需要这样的类型,你没得到错误配置的对象。

然而,有一种可能性,即有将被添加一个钩在不久的将来的某个点以创建非注册类型,这是由WCF集成设施需要的。 (编辑 - 它是在2.1中加入 - 看一看ILazyComponentLoaders)

<强>反正下,无论懒惰部件装载机的,可以执行最佳的是使用流利API批量从符合所需标准的前期的组件注册的所有类型。它没有更多的代码,你会在晚上睡得更好。

使用懒装载机只有当你在启动时有真的没有足够的信息(在组成根的)来确定你需要哪些组件。

其他提示

温莎不支持开箱即用,但您可以创建扩展方法来做到这一点:

static class WindsorExtensions
{
    public static object ResolveType(this IWindsorContainer container, Type type)
    {
        if ( type.IsClass && !container.Kernel.HasComponent(type) )
            container.Kernel.AddComponent(type.FullName, type, LifestyleType.Transient);
        return container.Resolve(type);
     }

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

class Program
{
    static void Main(string[] args)
    {
        IUnityContainer unityContainer = new UnityContainer();
        IWindsorContainer windsorContainer = new WindsorContainer();

        Program unityProgram = unityContainer.Resolve<Program>();
        Program castleProgram = windsorContainer.ResolveType<Program>();
    }
}

克日什托夫·不要害怕在这里链接到自己的博客:)的 http://devlicious.com/blogs/krzysztof_kozmic/archive/2009/11/16/castle-windsor-lazy-loading.aspx

另外,我发现这个简单的实现有用的在我的WPF应用程序,去除串contraint和你接近一般情况下

public class ViewModelLoader : Castle.MicroKernel.Resolvers.ILazyComponentLoader {
    public IRegistration Load(string key, Type service)
    {
        if (service == null)
            return null;
        if (service.Name.EndsWith("ViewModel", StringComparison.CurrentCultureIgnoreCase))
            return Component.For(service).Named(key);
        else
            return null;
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top