/// <summary> /// Creates ServicedComponent wrapper around target class. /// </summary> /// <param name="module">Dynamic module builder to use</param> /// <param name="baseType"></param> /// <param name="targetType">Type of the exported object.</param> /// <param name="springManagedLifecycle">whether to generate lookups in ContextRegistry for each service method call or use a 'new'ed target instance</param> /// <remarks> /// if <paramref name="springManagedLifecycle"/> is <c>true</c>, each ServicedComponent method call will look similar to /// <code> /// class MyServicedComponent { /// void MethodX() { /// ContextRegistry.GetContext().GetObject("TargetName").MethodX(); /// } /// } /// </code> /// <br/> /// if <paramref name="springManagedLifecycle"/> is <c>false</c>, the instance will be simply created at component activation using 'new': /// <code> /// class MyServicedComponent { /// TargetType target = new TargetType(); /// /// void MethodX() { /// target.MethodX(); /// } /// } /// </code> /// <br/> /// The differences are of course that in the former case, the target lifecycle is entirely managed by Spring, thus avoiding /// issues with ServiceComponent activation/deactivation as well as removing the need for default constructors. /// </remarks> public Type CreateWrapperType(ModuleBuilder module, Type baseType, Type targetType, bool springManagedLifecycle) { ValidateConfiguration(); // create wrapper using appropriate proxy builder IProxyTypeBuilder proxyBuilder; if (springManagedLifecycle) { proxyBuilder = new SpringManagedServicedComponentProxyTypeBuilder(module, baseType, this); } else { proxyBuilder = new SimpleServicedComponentProxyTypeBuilder(module, baseType); } proxyBuilder.Name = _objectName; proxyBuilder.TargetType = targetType; if (_interfaces != null && _interfaces.Length > 0) { proxyBuilder.Interfaces = TypeResolutionUtils.ResolveInterfaceArray(_interfaces); } proxyBuilder.TypeAttributes = TypeAttributes; proxyBuilder.MemberAttributes = MemberAttributes; Type componentType = proxyBuilder.BuildProxyType(); // create and register client-side proxy factory for component return componentType; }