public void Should_pre_initialize_provider_using_app_config() { Assert.Inconclusive(); // Setup var sut = new PlasmaContainer(); // Execute var two = sut.Get <ITwo>(); // Verify Assert.IsInstanceOfType(two.OneA, typeof(One1)); Assert.IsInstanceOfType(two.OneB, typeof(One2)); }
/// <summary> /// Finally write all code /// End your file with that line /// </summary> public static void PlasmaGenerate(this IMetaWriter writer) { #region PREPARE _writerTmp = writer; var ctx = new PlasmaContainer(); // AssemblyAnalyzeCache.LoadAll(writer); AssemblyAnalyzeCache.AnalyzeImpls(); // a set of types that is going to be asked from container var requests = new HashSet <Type>(_context.Types); var requestsProcessed = new HashSet <Type>(); var faceImpls = ctx.Get <FaceImplStrategy>(); var factory = ctx.Get <FactoryStrategy>(); var plumbing = ctx.Get <PlumbingStrategy>(); var miner = ctx.Get <StaticMining>(); miner.RequestByType += Miner_RequestByType; writer.WriteLine("// Analyze..."); while (requests.Count > 0) { _requestsFromMiner.Clear(); // not necessary - just to simplify debugging var fromFace = faceImpls.GetRequests(requests).ToArray(); var fromFact = factory.GetRequests(requests).ToArray(); var fromPlumb = plumbing.GetRequests(requests).ToArray(); foreach (var request in requests) { requestsProcessed.Add(request); } // new requests requests = new HashSet <Type>(fromFace.Concat(fromFact).Concat(fromPlumb).Concat(_requestsFromMiner).Except(requestsProcessed)); writer.WriteLine("// New requests: {0}", string.Join(", ", requests.Select(x => x.CSharpTypeIdentifier()))); } miner.RequestByType -= Miner_RequestByType; writer.WriteLine("// Analyze completed"); #endregion #region Proxy if (_enableProxy) { foreach (var type in _context.Types.Where(x => x.IsInterface)) { _proxyGenerator.Generate(writer, type); // GenerateStub(writer, type); } } #endregion #region Null if (_enableNullObject) { var req = _context.Types.Where(x => x.IsInterface); do { foreach (var type in req.ToArray()) { try { writer.Transactional(w => _nullGenerator.Generate(writer, type)); } catch (Exception ex) { writer.WriteLine("#warning " + ex.Message); writer.WriteLine("/*"); writer.WriteLine(ExceptionAnalyzer.ExceptionDetails(ex)); writer.WriteLine("*/"); } } req = _nullGenerator.RequestedObjects.Except(_nullGenerator.NullObjects).ToArray(); _nullGenerator.RequestedObjects.Clear(); } while (req.Any()); } #endregion writer.WriteLine(@" public static partial class PlasmaRegistration {{ static volatile bool _executed; public static void Run({1}? reflectionPermission = null) {{ if (_executed) {{ return; }} _executed = true; {0}.DefaultReflectionPermission = reflectionPermission ?? {1}.Throw; ", typeof(PlasmaContainer), typeof(ReflectionPermission)); writer.WriteLine(); // ignore tabs #region Factory writer.WriteLine(); writer.WriteLine("// Factory "); factory.Write(writer); #endregion #region face impl writer.WriteLine(); writer.WriteLine("// Iface impl"); faceImpls.Write(writer); #endregion #region plumbers writer.WriteLine(); writer.WriteLine("// Plumbers (Property injectors)"); plumbing.Write(writer); #endregion #region null object register if (_enableNullObject) { foreach (var type in _nullGenerator.NullObjects.Concat(_nullGenerator.ExplicitRequests).Distinct()) { if (type.IsGenericType && type.IsGenericTypeDefinition) { writer.WriteLine(@"Null.RegisterGeneric(typeof({0}), t => typeof ({1}).MakeGenericType(t).GetField(""Instance"").GetValue(null));" , type.CSharpTypeIdentifier(_omitTypeDef), _nullGenerator.GetTypeName(type).FullNameGenericNoT); //typeof (NullEnumerable<>).MakeGenericType(t).GetField("Instance").GetValue(null)); } else { writer.WriteLine("Null.Register<{0}>({1}.Instance);", type, _nullGenerator.GetTypeName(type).FullNameGeneric); } } } #endregion writer.WriteLine(@" } } "); }