Здесь есть несколько вариантов в зависимости от вашего дизайна и конкретной проблемы.Первое, самое простое решение - просто указать значение, когда вы запрашиваете сервис у Ninject
Kernel.Get<IClassA>("runtimeDependencyValue");
Если это невозможно, однако, все становится немного интереснее.Способ, который я решил ранее, заключается в создании контекстных привязок к самому System.String
.
Скажем, если я хочу привязать строку подключения, я создам собственный атрибут:
[AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class ConnectionStringAttribute : Attribute
{
/// <summary>
/// Denotes the setting that you want to populate the given property with.
/// </summary>
public string SettingName { get; private set; }
public ConnectionStringAttribute(string configSettingName = "")
{
SettingName = configSettingName;
}
}
и затем я декорирую свой конструктор службы следующим образом:
public class ClassA : IClassA
{
public ClassA([ConnectionString("AppDB")] string runtimeDependency) { /* ... */ }
}
Наконец, моя привязка будет выглядеть примерно так:
Bind<string>()
.ToMethod(ctx =>
{
var attr = (ConnectionStringAttribute)context.Request.Target.GetCustomAttributes(typeof(ConnectionStringAttribute), true).First();
string settingName = string.IsNullOrEmpty(attr.SettingName) ? context.Request.Target.Name : attr.SettingName;
return ConfigurationManager.ConnectionStrings[settingName].ConnectionString;
})
.WhenTargetHas<ConnectionStringAttribute>();
Вы поняли идею.Надеюсь, это поможет:)