2015-05-27 35 views
1

我对使用实体框架使用Code First Migrations进行编码。我正在使用一个自定义的构造函数,该构造函数具有特定于应用程序中登录的某个用户的连接字符串。使用自定义构造函数进行代码优先迁移

当应用程序加载时,如果数据库上下文有任何更改,我想用用户连接字符串初始化数据库并将其迁移到最新版本。我正在使用结构图来注入工作单元。

全球ASAX

ObjectFactory.Configure(cfg => 
     { 
      cfg.AddRegistry(new StandardRegistry()); 
      cfg.AddRegistry(new ControllerRegistry()); 
      cfg.AddRegistry(new ActionFilterRegistry(() => Container ?? ObjectFactory.Container)); 
      cfg.AddRegistry(new MvcRegistry()); 
      cfg.AddRegistry(new TaskRegistry()); 
      cfg.AddRegistry(new ModelMetadataRegistry()); 
     }); 

StandardRegistry类

For<ICustomerUnitOfWork>().Use(new CustomerUnitOfWork(new CustomerContext())); 
     For<CustomerContext>().Use(new CustomerContext()); 

在这一点上我不当知道用户的ConnectionString因为用户没有登录。问题模型已经改变,结构图会引发异常,因为上下文模型已经改变。

语境

private static string _connectionString; 

    static CustomerContext() 
    { 
     Database.SetInitializer(new MigrateDatabaseToLatestVersion<CustomerContext, Configuration>()); 
    } 

    public CustomerContext() 
     : base(string.IsNullOrEmpty(_connectionString) ? "FooDatabase" : _connectionString) 
    { 
     if (string.IsNullOrEmpty(_connectionString)) 
      Database.SetInitializer(new CustomerContextInitializer()); 
    } 


    public CustomerContext(string connectionString) 
     : base(connectionString) 
    { 
     if (string.IsNullOrEmpty(_connectionString)) 
      Database.SetInitializer(new CustomerContextInitializer()); 
     _connectionString = connectionString; 
    } 

CustomerContextInitializer

public class CustomerContextInitializer : CreateDatabaseIfNotExists<CustomerContext> 
{ 
    protected override void Seed(CustomerContext context) 
    { 
     var informationService = new InformationService 
     { 
      ObjectState = ObjectState.Added, 
      ConnectorClass = 
       "Conexio.InformationService.Contracts.IInformationService, Conexio.InformationService.Contracts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", 
      DisplayName = "IInformationService" 
     }; 

是有办法的规则添加到standardRegistry类运行时调用与ConnectionString中constructur?还是有另一种方法来解决这个问题?

回答

0

如果我正确理解你的问题,解决这个你最好的方法是通过创建一个工厂类,是负责在运行时,然后可以在你的StructureMap注册表中配置像这样创建的ICustomerUnitOfWork实例:

this.For<ICustomerUnitOfWork>().Use(ctx => ctx.GetInstance<YourFactoryClass>().ResolveCustomerUnitOfWork()); 

然后,您的ICustomerUnitOfWork将解析为您的工厂类,该工厂类可以注入其自己的一组依赖项,以确定正确的上下文是什么。

public interface ICustomerUnitOfWork 
{ 

} 

public class YourFactoryClass 
{ 
    public YourFactoryClass(string connectionString) 
    { 

    } 

    public ICustomerUnitOfWork ResolveCustomerUnitOfWork() 
    { 
     // Perform runtime configuration 

     return unitOfWork; 
    } 
} 

我希望这有助于!