我正在使用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);
}
非常感谢,史蒂夫