Conditional resolving is the last thing I don't understand at the moment.
Lets say we have an interface IAuthenticate:
public interface IAuthenticate{
bool Login(string user, string pass);
}
Now I have two types of authentication.
Twitter auth
public class TwitterAuth : IAuthenticate
{
bool Login(string user, string pass)
{
//connect to twitter api
}
}
Facebook Auth
public class FacebookAuth: IAuthenticate
{
bool Login(string user, string pass)
{
//connect to fb api
}
}
Registering types in unity config:
unityContainer.RegisterType<IAuthenticate, TwitterAuth>();
unityContainer.RegisterType<IAuthenticate, FacebookAuth>();
inject objects via DI in our controller:
private readonly IAuthenticate _authenticate;
public AuthenticateController(IAuthenticate authenticate)
{
_authenticate = authenticate;
}
// login with twitter
public virtual ActionResult Twitter(string user, string pass)
{
bool success =
_authenticate.Login(user, pass);
}
// login with fb
public virtual ActionResult Facebook(string user, string pass)
{
bool success =
_authenticate.Login(user, pass);
}
// login with google
public virtual ActionResult Google(string user, string pass)
{
bool success =
_authenticate.Login(user, pass);
}
How exactly will unity know which object does it have to resolve for different types of authentication? How do I do conditional resolving in this case?
I spoke with friend of mine, and he explained if this situation appears it is wrong design, but this is just factory pattern used.
IAuthenticateare not interchangeable for one another (which means that a consumer such as theAuthenticateControllerwill not work correctly if it gets the wrong implementation), you are violating LSP. The solution in that case is often to give each implementation its own abstraction. - Steven