When we write software, we need a way to separate classes. If we put all classes in one folder/project, it would be a complete mess.
So almost all programs have to:
- save state/data somewhere. It can be database. We want to create classes for mapping, e.g. SQL tables to POCO classes. Let's call this layer as
Model
.
- apply some business rules model. This layer brings together managers or methods to finish a complete task such as E.g. Calculate the nearest distance between cities or make a coffee from many ingredients. Let's call this layer as
Service
.
- show handled data by business rules to user. Let's call this layer as
View
.
So for me:
- services should be used to assemble multiple managers to finish a complete task.
- managers are used to apply some business logic for one concrete model. E.g.
UserManager
for Chat System
can have the following methods such as GetUserById
, GetOnlineUsers()
, AddUser()
, UserLogin()
, UserLogoff()
UPDATE:
I saw services offen in ASP.NET MVC. So this is a simple example:
This is a model:
public class Blog
{
public string Name { get; set; }
public IEnumerable<Post> Posts { get; set; }
public IEnumerable<Comment> Comments { get; set; }
}
And view models:
public class BlogViewModel
{
public string Name { get; set; }
public IEnumerable<PostViewModel> Posts { get; set; }
public IEnumerable<CommentViewModel> Comments { get; set; }
}
These are repositories:
public interface IPostRepository
{
IEnumerable<Post> GetById();
}
public interface ICommentRepository
{
IEnumerable<Comment> GetById();
}
public interface IBlogRepository
{
IEnumerable<Blog> GetById();
}
and our service:
public class BlogService
{
IPostRepository _postRepository;
ICommentRepository _commentRepository;
IBlogRepository _blogRepository;
public BlogService(IPostRepository postRepository,
ICommentRepository commentRepository, IBlogRepository blogRepository)
{
_postRepository = postRepository;
_commentRepository = commentRepository;
_blogRepository = blogRepository;
}
// here a place to accomplish the whole task
public BlogViewModel Get()
{
BlogViewModel blogViewModel = new BlogViewModel();
blogViewModel.Comments = _mapper.Map<IEnumerable<CommentViewModel>>(
_commentRepository.GetById());
blogViewModel.Posts = _mapper.Map<IEnumerable<PostViewModel>>(
_postRepository.GetById());
return new BlogViewModel();
}
}
and controller method:
public BlogViewModel Get()
{
return _blogService.Get();
}
An example of using manager
Let's create a chat application. The oop model could look like this:
User
class:
public class User
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string NickName { get; set; }
public Status Status { get; set; }
IEnumerable<Topic> Topics { get; set; }
}
Message
class:
public class Message
{
public int Id { get; set; }
public string Content { get; set; }
public DateTime DateCreated { get; set; }
}
Topic
class:
public class Topic
{
public IEnumerable<User> Participants { get; set; }
public IEnumerable<Message> Messages { get; set; }
public void AddMessage(Message message) { }
public void RemoveMessage(int id) { }
public void AlterMessage(Message message) { }
public void AddUser(User user) { }
public void RemoveUser(int id) { }
public void BlockUser(User user) { }
public void InviteUser(User user) { }
}
Status
enum:
public enum Status {
Online,
Busy,
Available
}
ChatSystem
class:
public class ChatSystem
{
public IEnumerable<Topic> Topics { get; set; }
public void AddTopic(Topic topic) { }
public void RemoveTopic(int id) { }
public void AlterTopic(Topic topic) { }
public void Login(string email, string password) { }
public void Logoff() { }
}
UserManager
class:
public class UserManager
{
public IEnumerable<User> AllUsers { get; set; }
public User GetById()
{
return new User();
}
public Status GetUserStatus()
{
return new User().Status;
}
public void AddUser(User user) { }
public void RemoveUser(User user) { }
public void SendEmail(User user) { }
}