访问Ninject WhereTargetHas属性属性值

时间:2015-05-08 13:33:30

标签: c# ninject

我正在使用Ninject为Web项目中的许多类提供DI,其中一些是使用公共sql连接工厂类的数据库存储库,该工厂类是使用连接字符串名称传递给构造函数构建的。

我使用以下代码,但是从目标属性获取连接字符串名称的代码让我感到不安,有人可以提出更优雅的解决方案吗?

在实例化IHeaderServiceRepository类时,Ninject会注入一个IConnectionFactory实例 - 当它执行此操作时,它会在绑定上使用ToMethod。此方法获取目标的自定义属性(正确的属性类型),并使用它的连接字符串名称传递到创建的类型。

我期待的是能够通过Ninject Request对象访问目标上的自定义属性,但我似乎无法找到它。

有人可以告诉我如何做到这一点或指出更好的方法来做这一切吗?

Ninject绑定:

kernel.Bind<IHeaderServiceRepository>().To<HeaderServiceRepository>();
kernel.Bind<IConnectionFactory>().ToMethod(
            ctr =>
            {
                var customAttribute = ctr.Request.Target.GetCustomAttributes(false)
                                       .OfType<ConnectionStringAttr>().FirstOrDefault();
                var connectionString = customAttribute != null ?
                                    customAttribute.ConnectionStringName : string.Empty;
                return new ConnectionFactoryBase(connectionString);
            }).WhenTargetHas<ConnectionStringAttr>().InRequestScope();

属性:

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = true, Inherited = true)]
public class ConnectionStringAttr : Attribute
{
    public string ConnectionStringName { get; private set; }

    public ConnectionStringAttr(string connectionStringName)
    {
        this.ConnectionStringName = connectionStringName;
    }
}

存储库代码:

public class HeaderServiceRepository : IHeaderServiceRepository
{
    private readonly ILogger log;

    private readonly StoredProcedureHelper storedProcedureHelper;
    private readonly IConnectionFactory connectionFactory;

    public HeaderServiceRepository([ConnectionStringAttr("CONNECTION_STRING_NAME")] IConnectionFactory connectionFactory, ILogger logger)
    {
        this.connectionFactory = connectionFactory;
        this.log = logger;
        this.storedProcedureHelper = new StoredProcedureHelper(this.connectionFactory, this.log);
    }   

非常感谢,史蒂夫

0 个答案:

没有答案