public sealed class ConstructorSelector : IConstructorSelector { public static readonly IConstructorSelector MostParameters = new ConstructorSelector(type => type.GetConstructors() .OrderByDescending(c => c.GetParameters().Length).First());
public static readonly IConstructorSelector LeastParameters = new ConstructorSelector(type => type.GetConstructors() .OrderBy(c => c.GetParameters().Length).First());
private readonly Func _selector;
public ConstructorSelector(Func selector) { _selector = selector; }
public ConstructorInfo GetConstructor(Type type) { return _selector(type); } }
public interface IConstructorSelector { ConstructorInfo GetConstructor(Type type); }
public static class SimpleInjectorExtesions { public static void RegisterOpenGeneric(this Container container, Type serviceType, Type implementationtype, IConstructorSelector selector) { //TODO: register the service with a fake delegate container.ExpressionBuilt += (sender, e) => { if (e.RegisteredServiceType != serviceType) return; var ctor = selector.GetConstructor(implementationtype);
var parameters = from p in ctor.GetParameters() select container.GetRegistration(p.ParameterType, true) .BuildExpression();
public class SpecialConstructorResolutionBehavior : IConstructorResolutionBehavior { private IConstructorResolutionBehavior original;
public SpecialConstructorResolutionBehavior( IConstructorResolutionBehavior original) { this.original = original; }
public ConstructorInfo GetConstructor(Type serviceType, Type implementationType) { if (serviceType.IsGenericType && serviceType.GetGenericTypeDefinition() == typeof(IOpenType<>)) { // do alternative constructor selection here for open types. // For instance: return ( from ctor in implementationType.GetConstructors() orderby ctor.GetParameters().Length descending select ctor) .First(); }
// fall back to default behavior return original.GetConstructor(serviceType, implementationType); } }
您可以按如下方式注册:
container.Options.ConstructorResolutionBehavior = new SpecialConstructorResolutionBehavior( container.Options.ConstructorResolutionBehavior);
using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Reflection; using SimpleInjector; using SimpleInjector.Advanced; using SimpleInjector.Extensions;
public static class OpenGenericConstructorExtensions { public static void EnableOpenGenericConstructorSelection( this ContainerOptions options) { var selectors = new List<>>();
options.ConstructorResolutionBehavior = new ConstructorResolutionBehavior( options.ConstructorResolutionBehavior, selectors);
Như hiện tại, câu hỏi này không phù hợp với định dạng Hỏi & Đáp của chúng tôi. Chúng tôi mong đợi câu trả lời sẽ được hỗ trợ bởi các sự kiện, trích dẫn hoặc chuyên môn, nhưng câu hỏi có thể gây ra tranh luận, tranh luận, bỏ phiếu hoặc thảo luận mở rộng. Nếu bạn cảm thấy vấn đề này có thể được cải thiện và có thể mở lại, hãy truy cập
Tôi là một lập trình viên xuất sắc, rất giỏi!