我刚刚更新到最新的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
定义默认实例我做错了什么?我发现很难找到与最新语法相关的文档而不是引用弃用的方法:(
答案 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.InitializeObjectFactory.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");
});
希望这有帮助。