Соглашение о введении параметров конструктора Structuremap

Существует ли соглашение об указании значения для параметров конструктора с именем «x». Например, сделайте что-то вроде ниже

Для любой запрошенной зависимости, имеющей параметр конструктора с именем "pathToFile" , укажите это значение.

Я мог бы сделать это с синтаксисом For и с использованием ctor, но не могу написать один и тот же фрагмент кода для каждого класса, который я хочу настроить.

public class FileManager(string pathToFile):IDocumentManager
{

}

Когда я когда-либо запрашиваю IDocumentManager (зависимость), он (экземпляр) имеет конструктор с параметром с именем pathToFile, поэтому я хочу, чтобы он был введен с некоторым значением


person Deeptechtons    schedule 08.10.2014    source источник


Ответы (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/

person marisks    schedule 09.07.2015