【发布时间】:2014-08-06 14:10:21
【问题描述】:
我正在使用 WPF、MVVM 和依赖注入模式编写登录窗口。我的问题是我必须使用用户在我的登录表单中写入的登录名和密码创建连接字符串,但我不知道如何根据良好做法进行操作。对象由 SimpleIoc 类创建,我在初始化期间传递了部分连接字符串,如数据库地址和端口。当用户写入他的登录名和密码时,我需要将此数据传递给数据库管理器以创建完整的连接字符串。每次调用某些函数将连接字符串的一部分与用户和密码连接时,我都不想传递登录名和密码。我可以在像 Initialize 这样的界面中创建函数,但在我看来这不是一个好主意,我认为有更好的方法来做到这一点。
这里是我如何做的示例:
public interface ILoginService
{
bool SomeAction(string parameter);
}
public class LoginService : ILoginService
{
private string _connectionString;
public LoginService(string connectionStringPart)
{
_connectionString = connectionStringPart;
}
public bool SomeAction(string parameter)
{
//Create connection, execute query etc.
return true;
}
}
public class MainViewModel : ViewModelBase
{
private ILoginService _loginService;
private string _login;
public string Login
{
get { return _login; }
set
{
_login = value;
RaisePropertyChanged("Login");
}
}
private string _password;
public string Password
{
get { return _password; }
set
{
_password = value;
RaisePropertyChanged("Password");
}
}
public MainViewModel(ILoginService loginService)
{
_loginService = loginService;
}
private RelayCommand _loginCommand;
public ICommand LoginCommand
{
get { return _loginCommand ?? (_loginCommand = new RelayCommand(ExecuteLogin)); }
}
private void ExecuteLogin()
{
//And here I must add login and password to _loginService but I don't want to do it by passing them to SomeAction method
_loginService.SomeAction("some parameter");
}
}
public class ViewModelLocator
{
public ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
SimpleIoc.Default.Register<ILoginService>(()=>{return new LoginService("Server=myServerAddress;Database=myDataBase;");});
SimpleIoc.Default.Register<MainViewModel>();
}
public MainViewModel Main
{
get
{
return ServiceLocator.Current.GetInstance<MainViewModel>();
}
}
public static void Cleanup()
{
// TODO Clear the ViewModels
}
}
【问题讨论】:
标签: c# wpf mvvm dependency-injection mvvm-light