Exemple #1
0
 public static void PlasmaRegisterType(this IMetaWriter writer, Type type)
 {
     if (PlasmaContainer.IsValidImplementationType(type))
     {
         writer.WriteLine("// " + type.CSharpTypeIdentifier());
         _context.Types.Add(type);
     }
 }
Exemple #2
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));
        }
        public void Should_initialize_with_two_different_generic_impls()
        {
            var pros = PlasmaContainer.GetPlumbingProperties(typeof(GenericPerformer));

            Assert.AreEqual(2, pros.Count());

            var test = _sut.Get <GenericPerformer>();

            Assert.IsNotNull(test);
            Assert.IsNotNull(test.Sdao1);
            Assert.IsNotNull(test.Sdao2);
            Assert.IsNotNull(test.Sdao3_);
        }
        /// <summary>
        /// Analyze type and yield all required type requests that are supposed to be directed to container
        /// </summary>
        public override IEnumerable <Type> GetRequestsCore(Type type)
        {
            var plumbingPros = PlasmaContainer.GetPlumbingProperties(type).ToArray();

            if (plumbingPros.Length > 0)
            {
                _result[type] = true;
                foreach (var pi in plumbingPros)
                {
                    _mining.GetArgument(pi);
                }
            }
            else
            {
                _result[type] = false;
            }
            return(Enumerable.Empty <Type>());           // requests from miner
        }
        /// <summary>
        /// Generate code necessary to prepare registers for working with types collected
        /// </summary>
        public override void Write(IMetaWriter writer)
        {
            foreach (var type in _result)
            {
                if (type.Value)
                {
                    var plumbingPros = PlasmaContainer.GetPlumbingProperties(type.Key).ToArray();
                    var plumbingc    = "";
                    foreach (var pi in plumbingPros)
                    {
                        plumbingc += string.Format("\tx.{0} = {1};\r\n", pi.Name, _mining.GetArgument(pi));
                    }
                    // todo remove extra cast in plumber
                    // todo remove dependancy on 'c'
                    writer.WriteLine(@"{2}.Register<{0}>((c, x)=>{{
{1}}});", type.Key, plumbingc, typeof(TypeAutoPlumberRegister));
                }
                else
                {
                    writer.WriteLine("{1}.RegisterNone(typeof({0}));", type.Key, typeof(TypeAutoPlumberRegister));
                }
            }
        }
Exemple #6
0
    public static object Object(Type type)
    {
        object value;

        if (_dic.TryGetValue(type, out value))
        {
            _accessed.Add(type);
            return(value);
        }
        if (type.IsGenericType)
        {
            var gtd = type.GetGenericTypeDefinition();
            Func <Type[], object> fact;
            if (_dicGeneric.TryGetValue(gtd, out fact))
            {
                _accessed.Add(gtd);
                value = fact(type.GetGenericArguments());
                Register(type, value);
                return(value);
            }
        }
        throw new PlasmaException("Null object is not registered for: " + PlasmaContainer.GetTypeName(type));
    }
Exemple #7
0
        public void MyTestMethod()
        {
            var ps = PlasmaContainer.GetPlumbingProperties(typeof(MyServiceWithAutomaticSetterOnlyInjection));

            Assert.AreEqual(1, ps.Count());
        }
Exemple #8
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(@"
	}
}

");
        }