【问题标题】:Creating connection string with dependency injection using MVVM Light使用 MVVM Light 使用依赖注入创建连接字符串
【发布时间】: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


    【解决方案1】:

    怎么样:

    public interface ILoginService
    {
        bool SomeAction(string parameter);
        string Password  {set; }
        string UserName {set; }
    }
    
    public class LoginService : ILoginService
    {
    
        private System.Data.SqlClient.SqlConnectionStringBuilder builder = new System.Data.SqlClient.SqlConnectionStringBuilder();
    
        private string _connectionString
        {
           get
           { return builder.ConnectionString;}
        }
    
        public LoginService(string connectionStringPart)
        {
            _connectionString = connectionStringPart;
        }
    
        public string Password
        {
            set { builder["Password"] =value; }
        }
    
        public string UserName
        {
            set { builder["user"] =value; }
        }
    
        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;
                _loginService.UserName = value; 
                RaisePropertyChanged("Login");
            }
        }
    
        private string _password;
    
        public string Password
        {
            get { return _password; }
            set
            {
                _password = value;
                _loginService.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()
        {
    
            _loginService.SomeAction("some parameter");
        }
    

    【讨论】:

    • 我会为您的登录服务设置用户、密码、服务器和数据库属性。然后根据需要使用msdn.microsoft.com/en-us/library/…SqlConnectionStringBuilder 生成字符串。
    • 感谢好主意,我已经在我的项目中做到了,但我想知道是否有更好的方法来做到这一点。也许工厂模式的一些实现会很好?
    猜你喜欢
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-25
    相关资源
    最近更新 更多