Соглашение о внедрении параметров конструктора Structuremap
Существует ли соглашение об указании значения для параметров конструктора с именем "x". Например сделать что-то вроде ниже
Для любой запрошенной зависимости, имеющей параметр конструктора с именем "pathToFile", укажите это значение.
Я мог бы сделать это с For
синтаксис и использование ctor
но не могу написать один и тот же кусок кода для каждого класса, который я хочу настроить.
public class FileManager(string pathToFile):IDocumentManager
{
}
Всякий раз, когда я запрашиваю IDocumentManager(зависимость), он (экземпляр) имеет конструктор с именем параметра pathToFile
так что я хочу, чтобы это было введено с некоторым значением
1 ответ
Можно создать пользовательское соглашение. Создать соглашение путем реализации IRegistrationConvention
, Затем в Process
Метод проверяет, является ли тип конкретным типом, проверяет, имеет ли он требуемый параметр конструктора, а затем регистрирует параметр конструктора для всех реализуемых им интерфейсов, а также сам вводит тип. Я использую такое соглашение, чтобы ввести строку подключения.
public class ConnectionStringConvention : IRegistrationConvention
{
public void Process(Type type, Registry registry)
{
if (!type.IsConcrete() || type.IsGenericType) return;
if (!HasConnectionString(type)) return;
type.GetInterfaces().Each(@interface =>
{
registry.For(@interface)
.Use(type)
.WithProperty("connectionString")
.EqualTo(SiteConfiguration.AppConnectionString);
});
registry.For(type)
.Use(type)
.WithProperty("connectionString")
.EqualTo(SiteConfiguration.AppConnectionString);
}
private bool HasConnectionString(Type type)
{
return type.GetConstructors()
.Any(c => c.GetParameters()
.Any(p => p.Name == "connectionString"));
}
}
После создания соглашения зарегистрируйте его в конфигурации вашего контейнера:
Scan(x =>
{
x.TheCallingAssembly();
x.WithDefaultConventions();
x.Convention<ConnectionStringConvention>();
});
Для получения дополнительной информации проверьте:
http://structuremap.github.io/registration/auto-registration-and-conventions/