我正在根据related question的答案探索Castle Windsor的安装程序功能。我想使用Web.config来指定数据库的名称,我宁愿不在我的代码中明确设置数据库名称。我试图克日什托夫·Koźmic的例子,当我登场的项目我的突破点container.Register
被击中,但依赖仍然没有解决:Castle Windsor控制反转(IoC):使用Web.config解决依赖关系
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" })));
}
}
桑德斯认为,我们可以使用在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>
我SqlUsersRepository
和IUsersRepository
都在同一个命名空间,但他们在当前被引用的类库中的一部分项目。 SqlUsersRepository
从web.config中查找连接字符串的数据库名称:
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
}
任何帮助?
P.S.
我仍然得到一个例外,即使我用的是硬编码的数据库名称(如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文件来存储温莎城堡的特定部分。
请不要使用桑德斯的书,什么温莎相关的,这是非常受现在已经过时。 – 2011-02-26 22:05:12
@Mauricio,使用Web.config存储存储库类所需的连接字符串和数据库名称**具有**有用!它允许你通过简单地添加/更改Web.config中的连接字符串来交换你的数据库......当然,但不是那样。 – Kiril 2011-02-26 22:14:12
。这是一个过时的机制。 – 2011-02-26 22:46:15