Внедрение строки подключения с не работающей StructureMap - PullRequest
2 голосов
/ 16 ноября 2011

Я все еще очень плохо знаком с Structure Map, поэтому не могу понять, почему это не работает. Я внедряю «строку подключения» в хранилище и получаю следующую ошибку из Структурной карты:

Код исключения StructureMap: 205 Отсутствует запрошенное свойство Instance "purchaseOrdersFilePath" для InstanceKey "a04b4f71-4171-4e9f-b98d-170fc9ee005f"

Кстати, строка подключения указана в кавычках, потому что я также играю с linq to xml, поэтому «строка подключения» на самом деле является путем к файлу. Я добавляю это на тот случай, если это как-то связано с проблемой.

Мой код выглядит следующим образом:

public class PurchaseOrderRepository : IPurchaseOrderRepository
{
    private readonly string PurchaseOrdersFilePath;

    public PurchaseOrderRepository(string purchaseOrdersFilePath)
    {
        if (string.IsNullOrWhiteSpace(purchaseOrdersFilePath)) throw new ArgumentNullException("purchaseOrdersFilePath");

        PurchaseOrdersFilePath = purchaseOrdersFilePath;
    }
 }

В моем файле Global.asax у меня есть следующий оператор конфигурации:

private void RegisterControllerFactory()
{
    var ioc = new Container();

    var controllerFactory = new IocControllerFactory(ioc);
    ControllerBuilder.Current.SetControllerFactory(controllerFactory);

    ioc.Configure(r => r.Scan(x =>
    {
        x.AssemblyContainingType<HomeController>();
        x.AddAllTypesOf<IController>();
        x.Include(t => typeof(IController).IsAssignableFrom(t));
    }));

    ioc.Configure(r => r
        .ForConcreteType<PurchaseOrderRepository>()
        .Configure.Ctor<string>().Is(@"C:\Users\sromero\Documents\Visual Studio 2010\Projects\DIDemo\SupportFiles\POS.xml"));
}

Что я делаю не так?

Спасибо за вашу помощь.

Ответы [ 2 ]

6 голосов
/ 16 ноября 2011

Оказывается, я настраивал один и тот же компонент дважды (что я не отражал в примере кода в вопросе), поэтому я делал следующее:

ioc.Configure(r => r
                .For<IPurchaseOrderRepository>()
                .Use<PurchaseOrderRepository>());

    ioc.Configure(r => r
            .ForConcreteType<PurchaseOrderRepository>()
            .Configure.Ctor<string>().Is(@"C:\Users\sromero\Documents\Visual Studio 2010\Projects\DIDemo\SupportFiles\POS.xml"));

должен был сделать это:

ioc.Configure(r => r
                .For<IPurchaseOrderRepository>()
                .Use<PurchaseOrderRepository>()
                .Ctor<string>().Is(@"C:\Users\sromero\Documents\Visual Studio 2010\Projects\DIDemo\SupportFiles\POS.xml"));
2 голосов
/ 16 ноября 2011

Попробуйте:

.Ctor<string>("purchaseOrdersFilePath").Is(@"C:\Users\sromero\Documents\Visual Studio 2010\Projects\DIDemo\SupportFiles\POS.xml"));
...