Jaume
Jaume

Reputation: 763

Creating connection string with dependency injection using MVVM Light

I'm writing login window using WPF, MVVM and dependency injection patterns. My problem is that I must create connection string using login and password which user writes in my login form and I don't know how to do it according to good practice. Object is created by SimpleIoc class and I pass part of connection string like database adress and port during initialization. When user write his login and password I need to pass this data to database manager to create full connection string. I don't want to pass login and password every time when some function is called to connect part of connection string with user and password. I can create function in interface like Initialize but in my point of view that it isn't good idea and I think there is better way to do it.

Here is sample how I do it:

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
    }
}

Upvotes: 0

Views: 827

Answers (1)

JKennedy
JKennedy

Reputation: 18799

How About:

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");
    }

Upvotes: 1

Related Questions