Соглашение о внедрении параметров конструктора 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/

http://www.sep.com/sep-blog/2010/06/04/teaching-structuremap-about-c-4-0-optional-parameters-and-default-values/

Другие вопросы по тегам