``` csharp
public class UserService
{
public int CreateNewUserProfile(string username, string password, int age, int gender, string address, DateTime birthday)
{
IUserRepository userRepository = new DBFactory.CreateUserRepository(Configs.UserRepositoryType);
User user = userRepository.GetUserByUsername(username);
if (user != null)
return -1;
user = new User(username, password);
int inserCount = userRepository.Insert(user);
if (insertCount == 0)
return -2;
else
{
MSSQLUserProfileRepository userProfileRepository = new MSSQLUserProfileRepository("connection string");
var userProfile = Helper.Map<UserProfile>();
UserProfile userProfile = new UserProfile();
userProfile.UserName = username;
userProfile.Age = age;
userProfile.Gender = gender;
userProfile.Address = address;
userProfile.Birthday = birthday;
insertCount = userProfileRepository.Insert(userProfile);
if (insertCount == 0)
return -3;
}
return 0;
}
}
public class UserController : ApiController
{
// API
public bool Register(NewUserParam p)
{
var result = (new UserService()).CreateNewUserProfile(p.Username, p.Password, p.Age, p.Gender, p.Address, p.Birthday);
return result == 0;
}
}
public interface IUserRepository
{
User GetUserByUsername(string userName);
int Insert(User user);
}
public class DBFactory
{
public static IUserRepository CreateUserRepository(DBType type)
{
switch(type)
{
case DBType.MYSQL:
return MYSQLUserRepository();
break;
case DBType.MSSQL:
return MSSQLUserRepository();
break;
case DBType.Mock:
return MockUserRepository();
break;
default:
throw Exception("無法認知的類型");
}
}
}
public enum DBType
{
MYSQL,
MSSQL
}
public Class Configs
{
public DBType UserRepositoryType {get;set;}
}
public class MockUserRepository : IUserRepository
{
public IMock<IUserRepository> MockObj{get;set;}
public MockUserRepository()
{
MockObj.SetData(a => a.GetUserByUsername<string>().Return(a => "Test GetUserByUsername").Verify();
MockObj.SetData(a => a.Insert<User>().Return(a => "Test Insert").Verify();
}
public User GetUserByUsername(string userName)
{
return MockObj.Object.GetUserByUsername(userName);
}
public int Insert(User user)
{
return MockObj.Object.Insert(user);
}
}
```