我正在根据related question的答案探索Castle Windsor的安装程序功能。我想使用Web.config来指定数据库的名称,而我不想在代码中显式设置数据库的名称。我尝试了KrzysztofKoźmic的示例,当我启动该项目时,我在container.Register处的断点被击中,但是依旧无法解决:

public class RepositoriesInstaller : IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container.Register(AllTypes.FromThisAssembly()
                            .Where(Component.IsInSameNamespaceAs<SqlUsersRepository>())
                            .WithService.DefaultInterface()
                            .Configure(c => c.LifeStyle.Transient
                            .DependsOn(new { databaseName = "MyDatabaseName" })));
    }
}


桑德斯(Sanders)建议我们可以使用Web.config来解决依赖关系(请注意,他这样做是为了获取连接字符串,但是我的连接字符串是加密的,因此我的操作方式略有不同):

<castle>
    <components>
      <component id="SqlUsersRepository"
          service="MyDevArmyModel.Entities.IUsersRepository, MyDevArmyModel"
          type="MyDevArmyModel.Entities.SqlUsersRepository, MyDevArmyModel">
        <parameters>
          <databaseName>MyDatabaseName</databaseName>
        </parameters>
      </component>
    </components>
</castle>


我的SqlUsersRepositoryIUsersRepository在同一个命名空间中,但是它们是类库的一部分,该类库在当前项目中被引用。 SqlUsersRepository从Web查找连接字符串。配置数据库名称:

public interface IUsersRepository
{
    IQueryable<User> Users { get; }
    // ...
    // and some other things
    // ...

}

public class SqlUsersRepository : IUsersRepository
{
    private DataContext dataContext;
    private Table<User> usersTable;

    public IQueryable<User> Users { get { return usersTable; } }

    public SqlUsersRepository(string databaseName)
    {
        HttpRequestWrapper request = new HttpRequestWrapper(System.Web.HttpContext.Current.Request);
        Configuration config = WebConfigurationManager.OpenWebConfiguration(request.ApplicationPath);
        dataContext = new DataContext(config.GetConnetionString(databaseName));
        usersTable = dataContext.GetTable<User>();
    }

    // .... the rest of the repository goes here
}


有什么帮助吗?

附言

即使我使用硬编码的数据库名称(如在RepositoriesInstaller中所示),我仍然遇到异常:


  “ /”应用程序中的服务器错误。不能
  创建组件
  'MyProjectName.Controllers.UserController'
  因为它有依赖关系
  满意。
  MyProjectName.Controllers.UserController
  正在等待以下内容
  依赖项:
  
  服务:
  -MyProjectName.Entities.IUsersRepository
  尚未注册。描述:
  在处理期间发生未处理的异常
  当前网站的执行
  请求。请检查堆栈跟踪
  有关该错误的更多信息
  以及它在代码中的起源。
  
  异常详细信息:
  Castle.MicroKernel.Handlers.HandlerException:
  无法创建组件
  'MyProjectName.Controllers.UserController'
  因为它有依赖关系
  满意。
  MyProjectName.Controllers.UserController
  正在等待以下内容
  依赖项:
  
  服务:
  -MyProjectName.Entities.IUsersRepository
  尚未注册。


更新资料
我已经发布了一个解决异常问题的答案,但是我还没有弄清楚如何使用Web.config来存储Castle Windsor的特定部分。

最佳答案

您应该可以通过将XML简化为以下内容来实现此目的:

<castle>
    <components>
      <component id="SqlUsersRepository">
        <parameters>
          <databaseName>MyDatabaseName</databaseName>
        </parameters>
      </component>
    </components>
</castle>


然后确保您的注册在正确的密钥/ ID下注册了存储库-例如像这样:

container.Register(AllTypes(...).Configure(c => c.Named(c.Implementation.Name)))


其中所有键都将设置为每种具体类型的简称。

请注意,这种命名方案可能不适合您,因此您可能应使c.Named(...)适应您认为适合的用例。只需确保存储库的注册密钥与XML中的id属性相匹配即可。

10-06 02:00