Синтаксис структуры карты в версии 2.5.4 - PullRequest
1 голос
/ 31 января 2010

Я только что обновился до последней dll Structuremap, и теперь мой сайт больше не работает во время выполнения из-за устаревших методов в Structuremap, поэтому я пытаюсь обновить код загрузчика.

В моем классе начальной загрузки я переписал его на:

public class Bootstrapper
{
    public static void ConfigureStructureMap()
    {
        ObjectFactory.Initialize(InitializeStructureMap);
    }

    private static void InitializeStructureMap(IInitializationExpression x)
    {
        x.AddRegistry(new DatabaseServiceRegistry());                        
        x.For<IArticleService>().Use<ArticleService>();
        x.For<IArticleRepository>().Use<SqlArticleRepository>();
    } 
}

Я добавил строку реестра, так как использую Linq to SQL, которая находится в отдельном проекте.

Это код, который работал в старой версии StructureMap:

public class DatabaseServiceRegistry : Registry
{
    public override void ConfigureStructureMap()
    {
        ForRequestedType<Database>()
        .TheDefaultIs(() => new Database(Settings.Default.server))
        .CacheBy(InstanceScope.Hybrid);                
    }

Я думаю, мне нужно переписать что-то вроде этого?

public void ConfigureStructureMap()
{
    ObjectFactory.Configure(x =>
    {                
        For<Database>().Use(new Database(Settings.Default.server));                
    });
}

Это компилируется, но затем я получаю ошибку времени выполнения:

Код исключения StructureMap: 202 Экземпляр по умолчанию не определен для PluginFamily MyProject.Data.SqlRepository.Database

Что я делаю не так? Мне трудно найти документацию, которая относится к последнему синтаксису и не ссылается на устаревшие методы: (

Ответы [ 2 ]

2 голосов
/ 01 февраля 2010

Вы почти правы с новым синтаксисом 2.5.4. Вам просто не хватает гибридной конфигурации. Я попытался воспроизвести вашу проблему и не смог (используя транк или выпуск 2.5.4). Вот мой успешный тест.

    public class DatabaseServiceRegistry : Registry
{
    public const string DefaultSettings = "my settings";

    public DatabaseServiceRegistry()
    {
        For<Database>().HybridHttpOrThreadLocalScoped().Use(new Database(DefaultSettings));
    }
}

public class Database
{
    public string Settings { get; set; }

    public Database(string settings)
    {
        Settings = settings;
    }
}

[TestFixture]
public class Structure_map_configuration
{
    [Test]
    public void TEST()
    {
        ObjectFactory.Initialize(cfg =>
        {
            cfg.AddRegistry<DatabaseServiceRegistry>();
        });

        ObjectFactory.GetInstance<Database>().Settings.ShouldEqual(DatabaseServiceRegistry.DefaultSettings);
    }
}

Возможно ли, что у вас есть два класса с именем «База данных» и вы настраиваете один из них в своем реестре, а другой - в расположении службы?

1 голос
/ 31 января 2010

Используйте вместо этого ObjectFactory.Initialize, если настроите:

ObjectFactory.Initialize(x =>
        {


            x
                .For<IProductsRepository>()
                .LifecycleIs(Lifecycles.GetLifecycle(InstanceScope.PerRequest))
                .Use<SqlProductsRepository>()
                .Ctor<string>("connectionString")
                .Is(@"Data Source=.\sqlexpress2008;Initial Catalog=SportsStore;Persist Security Info=True;User ID=xxxxx;Password=xxxxxxx");


        });

Надеюсь, это поможет.

...