Я изучал функциональность установщика Castle Windsor на основе ответов на вопрос . Я хочу использовать Web.config для указания имени базы данных, и я бы не стал явно указывать имя базы данных в своем коде. Я попробовал пример Krzysztof Koź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" })));
}
}
Сандерс предполагает, что мы можем использовать 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
}
Есть какая-нибудь помощь по этому поводу?
приписка
Я все еще получаю исключение, даже если я использую жестко закодированное имя базы данных (как показано в 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.