Exemple #1
0
        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));
        }
Exemple #2
0
        /// <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(@"
	}
}

");
        }