2.5.4版中的结构图语法

时间:2010-01-31 16:20:07

标签: asp.net-mvc structuremap

我刚刚更新到最新的structuremap dll,现在我的网站在运行时不再工作,因为在structuremap中已弃用的方法,所以我试图更新我的引导程序代码。

在我的bootstrapper类中,我将其重写为:

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 个答案:

答案 0 :(得分:2)

你几乎正确使用新的2.5.4语法。您只是缺少混合配置。我试图重现你的问题而不能(使用trunk或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 :(得分:1)

如果配置:

,请使用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");


        });

希望这有帮助。