Example #1
0
        private static string BuildInstantiation(DependencyDefinition from)
        {
            var builder = new StringBuilder();

            switch (from.Provider.Strategy)
            {
            case ProviderType.Implementation:
            {
                builder.AppendIndent(3);
                builder.Append(from.Type.FullName);
                builder.Append(" result = new ");
                builder.Append(from.Provider.Type.FullName);
                builder.AppendMethodDependencies(from.Provider.Dependencies, 3);
            }
            break;

            case ProviderType.Factory:
            {
                builder.AppendGetDependency(from.Provider.Type, assignTo: "factory", indent: 3, end: true);
                builder.AppendIndent(3);
                builder.Append(from.Type.FullName);
                builder.Append(" result = factory.");
                builder.Append(from.Provider.Method.Name);
                builder.AppendMethodDependencies(from.Provider.Dependencies, 3);
            }
            break;
            }

            builder.AppendLine();

            return(builder.ToString());
        }
Example #2
0
        private static string GetTemplateClassDependency(string classNamespace, DependencyDefinition dependency)
        {
            var rawText = dependency.Lifestyle == Lifestyles.Single ? _classDependencySingleTemplate : _classDependencyTemplate;

            return(rawText
                   .Replace("{{Namespace}}", classNamespace)
                   .Replace("{{DependencyType}}", dependency.Type.FullName)
                   .Replace("{{SafeDependencyType}}", SafeName(dependency.Type))
                   .Replace("{{InstantiateProvider}}", BuildInstantiation(dependency))
                   .Replace("{{Initializer}}", BuildInitializer(dependency))
                   .Replace("{{Decorators}}", BuildDecorators(dependency)));
        }
Example #3
0
        private static string BuildDecorators(DependencyDefinition from)
        {
            if (from?.Decorators?.Any() != true)
            {
                return("            // no decorators");
            }

            var builder = new StringBuilder();

            foreach (var decorator in from.Decorators)
            {
                builder.AppendIndent(3);
                builder.Append("result = new ");
                builder.Append(decorator.Type.FullName);
                builder.AppendMethodDependencies(decorator.Dependencies, 3);

                builder.AppendLine();
            }
            return(builder.ToString());
        }
Example #4
0
 private static string BuildInitializer(DependencyDefinition from)
 {
     // TODO: implement
     return(string.Empty);
 }
Example #5
0
        private static Dictionary <Type, DependencyDefinition> ResolveDependencies(Assembly inAssembly)
        {
            var dependencyAttributes     = inAssembly.GetCustomAttributes <DependencyAttribute>();
            var decoratorAttributes      = inAssembly.GetCustomAttributes <DecoratorAttribute>();
            var decoratorAttributeLookup = decoratorAttributes.ToLookup(item => item.Dependency);

            var dependencies = new Dictionary <Type, DependencyDefinition>();

            // validate
            // ? implementation
            //     ? type interface the provider must be concrete and implement interface
            //     provider cannot be interface
            //     factory must be appropriately returning
            //     ? type is concrete the provider must be null or factory or subclass
            //     provider must be constructable


            foreach (var dependencyAttribute in dependencyAttributes)
            {
                var dependency = new DependencyDefinition()
                {
                    Declaration = dependencyAttribute,
                    Type        = dependencyAttribute.Type,
                    Initializer = dependencyAttribute.Initializer,
                    Lifestyle   = dependencyAttribute.Lifestyle
                };
                dependencies.Add(dependencyAttribute.Type, dependency);
            }

            foreach (var value in dependencies.Values.ToList())
            {
                value.Provider = GetProvider(value.Declaration, dependencies);
            }

            foreach (var value in dependencies.Values)
            {
                {
                    if (value.Provider.Strategy == ProviderType.Implementation)
                    {
                        var constructor          = value.Provider.Type.GetConstructors().Single();
                        var providerDependencies = new List <DependencyDefinition>();
                        foreach (var parameter in constructor.GetParameters())
                        {
                            providerDependencies.Add(dependencies[parameter.ParameterType]);
                        }
                        value.Provider.Dependencies = providerDependencies;
                    }
                    else if (value.Provider.Strategy == ProviderType.Factory)
                    {
                        foreach (var parameter in value.Provider.Method.GetParameters())
                        {
                            if (dependencies.TryGetValue(parameter.ParameterType, out var dependency))
                            {
                                value.Provider.Dependencies.Add(dependency);
                            }
                            else
                            {
                                throw new Exception();
                            }
                        }
                    }
                }

                if (decoratorAttributeLookup.Contains(value.Type))
                {
                    value.Decorators = decoratorAttributeLookup[value.Type]
                                       .Select(item => new Decorator()
                    {
                        Type = item.Type
                    }).ToList();
                    foreach (var decorator in value.Decorators)
                    {
                        var  constructor           = decorator.Type.GetConstructors().Single();
                        var  decoratorDependencies = new List <DependencyDefinition>();
                        bool targetFound           = false;
                        foreach (var parameter in constructor.GetParameters())
                        {
                            if (parameter.ParameterType == value.Type)
                            {
                                if (!targetFound)
                                {
                                    targetFound = true;
                                    decoratorDependencies.Add(TargetDependency.Instance);
                                }
                                else
                                {
                                    throw new Exception();
                                }
                            }
                            else
                            {
                                decoratorDependencies.Add(dependencies[parameter.ParameterType]);
                            }
                        }
                        decorator.Dependencies = decoratorDependencies;
                    }
                }
            }

            return(dependencies);
        }