C# 如何获得在Unity中被注入的对象的类型?
我有一个类型在其构造函数中接收另一个类型,通常是创建它的对象的类型,例如:C# 如何获得在Unity中被注入的对象的类型?,c#,reflection,dependency-injection,unity-container,C#,Reflection,Dependency Injection,Unity Container,我有一个类型在其构造函数中接收另一个类型,通常是创建它的对象的类型,例如: public class Logger { public Logger(Type parent) { ... } } 我想指示Unity解析Logger将需要它的对象类型作为参数传递给它的构造函数。比如: // ... would be some directive to tell Unity to use the type that /// depends on Logger container.Regist
public class Logger {
public Logger(Type parent) { ... }
}
我想指示Unity解析Logger
将需要它的对象类型作为参数传递给它的构造函数。比如:
// ... would be some directive to tell Unity to use the type that
/// depends on Logger
container.RegisterType<Logger>(new InjectionConstructor(...));
它将返回:
var logger = new Logger(typeof(MyService));
return new MyService(logger);
可能吗?还有其他方法吗?实际上,您可以这样做:
internal class Program
{
static void Main( string[] args )
{
var container = new UnityContainer();
container.RegisterType<IInterface, Implementation>( new MyInjectionConstructor() );
// this instance will get a logger constructed with loggedType == typeof( Implementation )
var instance = container.Resolve<IInterface>();
}
}
internal class MyInjectionConstructor : InjectionMember
{
public override void AddPolicies( Type serviceType, Type implementationType, string name, IPolicyList policies )
{
policies.Set<IConstructorSelectorPolicy>( new MyConstructorSelectorPolicy(), new NamedTypeBuildKey( implementationType, name ) );
}
}
internal class MyConstructorSelectorPolicy : DefaultUnityConstructorSelectorPolicy
{
protected override IDependencyResolverPolicy CreateResolver( ParameterInfo parameter )
{
if( parameter.ParameterType == typeof( ILogger ) )
{
return new LiteralValueDependencyResolverPolicy( new Logger( parameter.Member.DeclaringType ) );
}
return base.CreateResolver( parameter );
}
}
internal interface ILogger
{
}
internal class Logger : ILogger
{
public Logger( Type loggedType )
{
}
}
internal interface IInterface
{
}
internal class Implementation : IInterface
{
public Implementation( ILogger logger )
{
}
}
内部类程序
{
静态void Main(字符串[]参数)
{
var container=new UnityContainer();
RegisterType(新的MyInjectionConstructor());
//此实例将获得一个使用loggedType==typeof(实现)构造的记录器
var instance=container.Resolve();
}
}
内部类MyInjectionConstructor:InjectionMember
{
public override void AddPolicies(类型serviceType、类型implementationType、字符串名称、IPolicyList策略)
{
Set(new MyConstructorSelectorPolicy(),new NamedTypeBuildKey(implementationType,name));
}
}
内部类MyConstructorSelectorPolicy:DefaultUnityConstructorSelectorPolicy
{
受保护的重写IDependencySolverPolicy CreateSolver(ParameterInfo参数)
{
if(parameter.ParameterType==typeof(ILogger))
{
返回新的LiteralValueDependencySolverPolicy(新记录器(parameter.Member.DeclaringType));
}
返回base.CreateResolver(参数);
}
}
内部接口ILogger
{
}
内部类记录器:ILogger
{
公共记录器(类型loggedType)
{
}
}
内部接口接口
{
}
内部类实现:IInterface
{
公共实现(ILogger记录器)
{
}
}
这只是概念验证代码,可能需要在生产使用前进行一些改进
internal class Program
{
static void Main( string[] args )
{
var container = new UnityContainer();
container.RegisterType<IInterface, Implementation>( new MyInjectionConstructor() );
// this instance will get a logger constructed with loggedType == typeof( Implementation )
var instance = container.Resolve<IInterface>();
}
}
internal class MyInjectionConstructor : InjectionMember
{
public override void AddPolicies( Type serviceType, Type implementationType, string name, IPolicyList policies )
{
policies.Set<IConstructorSelectorPolicy>( new MyConstructorSelectorPolicy(), new NamedTypeBuildKey( implementationType, name ) );
}
}
internal class MyConstructorSelectorPolicy : DefaultUnityConstructorSelectorPolicy
{
protected override IDependencyResolverPolicy CreateResolver( ParameterInfo parameter )
{
if( parameter.ParameterType == typeof( ILogger ) )
{
return new LiteralValueDependencyResolverPolicy( new Logger( parameter.Member.DeclaringType ) );
}
return base.CreateResolver( parameter );
}
}
internal interface ILogger
{
}
internal class Logger : ILogger
{
public Logger( Type loggedType )
{
}
}
internal interface IInterface
{
}
internal class Implementation : IInterface
{
public Implementation( ILogger logger )
{
}
}