ãŸããåç·šã®ã³ã¡ã³ããåèã«ãããŠããã ããŸããã
ãªããªã³ã¢ãŒããã¯ãã£
èªãã æ¬ãèšé²ããã¢ããªã±ãŒã·ã§ã³ãèšèšããŠãããšããŸãããããã ããæ£ç¢ºãæãããã«ãäœããŒãžèªãã ããèšé²ããããšããŸããããã¯ãé»å ±çšã®ãããããå Žåã«ãã£ãŠã¯ãã¹ã¯ãããçšã®ãããã®ããã«ãã¹ããŒããã©ã³ã«å¿ èŠãªå人çãªããã°ã©ã ã§ããããšãããã£ãŠãããããæ¬¡ã®ã¢ãŒããã¯ãã£ãªãã·ã§ã³ãèªç±ã«éžæããŠãã ããïŒ
ïŒTg BotãPhone AppãDesktopïŒ=> Asp.net Web Api =>ããŒã¿ããŒã¹
Asp.netCoreã¿ã€ãã®VisualStudioã§ãããžã§ã¯ããäœæããããã«WebApiãããžã§ã¯ãã¿ã€ããéžæããŸãã
ãã€ããšã©ãéãã®ïŒ
ãŸããã³ã³ãããŒã©ãŒã¯ã©ã¹ã¯ControllerBaseã¯ã©ã¹ãç¶æ¿ããŸãããã®ã¯ã©ã¹ã¯ããã¥ãŒïŒhtmlã³ãŒãïŒãè¿ãããšããµããŒãããã«MVCã®ããŒã¹ã¯ã©ã¹ã«ãªãããã«èšèšãããŠããŸãã
次ã«ããã¹ãŠã®ã¿ã€ãã®HTTPèŠæ±ãã«ããŒããRESTãµãŒãã¹ãå®è£ ããããã«èšèšãããŠãããèŠæ±ã«å¿çããŠãå¿çã¹ããŒã¿ã¹ãæç€ºçã«ç€ºãjsonãåä¿¡ããŸãããŸããããã©ã«ãã®ã³ã³ãããŒã©ãŒã[ApiController]屿§ã§ããŒã¯ãããŠãã ããš ãããããŸããããã«ã¯ãAPIå°çšã®äŸ¿å©ãªãªãã·ã§ã³ããããŸãã
次ã«ãããŒã¿ã®ä¿åæ¹æ³ã決å®ããå¿ èŠããããŸããç§ã¯å¹Žé12åããèªãã§ããªãããšãç¥ã£ãŠããã®ã§ãããŒã¿ããŒã¹ã衚ãcsvãã¡ã€ã«ã§ååã§ãã
ããã§ãæ¬ã説æããã¯ã©ã¹ãäœæããŸãã
Book.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace WebApiTest
{
public class Book
{
public int id { get; set; }
public string name { get; set; }
public string author { get; set; }
public int pages { get; set; }
public int readedPages { get; set; }
}
}
次ã«ãããŒã¿ããŒã¹ãæäœããããã®ã¯ã©ã¹ã«ã€ããŠèª¬æããŸãã
CsvDB.cs
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WebApiTest
{
public class CsvDB
{
const string dbPath = @"C:\\csv\books.csv";
private List<Book> books;
private void Init()
{
if (books != null)
return;
string[] lines = File.ReadAllLines(dbPath);
books = new List<Book>();
foreach(var line in lines)
{
string[] cells = line.Split(';');
Book newBook = new Book()
{
id = int.Parse(cells[0]),
name = cells[1],
author = cells[2],
pages = int.Parse(cells[3]),
readedPages = int.Parse(cells[4])
};
books.Add(newBook);
}
}
public int Add(Book item)
{
Init();
int nextId = books.Max(x => x.id) + 1;
item.id = nextId;
books.Add(item);
return nextId;
}
public void Delete(int id)
{
Init();
Book selectedToDelete = books.Where(x => x.id == id).FirstOrDefault();
if(selectedToDelete != null)
{
books.Remove(selectedToDelete);
}
}
public Book Get(int id)
{
Init();
Book book = books.Where(x => x.id == id).FirstOrDefault();
return book;
}
public IEnumerable<Book> GetList()
{
Init();
return books;
}
public void Save()
{
StringBuilder sb = new StringBuilder();
foreach(var book in books)
sb.Append($"{book.id};{book.name};{book.author};{book.pages};{book.readedPages}");
File.WriteAllText(dbPath, sb.ToString());
}
public bool Update(Book item)
{
var selectedBook = books.Where(x => x.id == item.id).FirstOrDefault();
if(selectedBook != null)
{
selectedBook.name = item.name;
selectedBook.author = item.author;
selectedBook.pages = item.pages;
selectedBook.readedPages = item.readedPages;
return true;
}
return false;
}
}
}
次ã«ãåé¡ã¯å°ãããAPIã远å ããŠãããšå¯Ÿè©±ã§ããããã«ããŸãã
BookController.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
namespace WebApiTest.Controllers
{
[ApiController]
[Route("[controller]")]
public class BookController : ControllerBase
{
private CsvDB db;
public BookController()
{
db = new CsvDB();
}
[HttpGet]
public IEnumerable<Book> GetList() => db.GetList();
[HttpGet("{id}")]
public Book Get(int id) => db.Get(id);
[HttpDelete("{id}")]
public void Delete(int id) => db.Delete(id);
[HttpPut]
public bool Put(Book book) => db.Update(book);
}
}
ãããŠãæ®ã£ãŠããã®ã¯UIã远å ããããšã ãã§ããããã¯äŸ¿å©ã§ãããããŠããã¹ãŠãæ©èœããŸãïŒ
æ¶ŒããïŒãããããããã劻ã¯åœŒå¥³ã«ããã®ãããªäŸ¿å©ãªãã®ã«ã¢ã¯ã»ã¹ã§ããããã«é Œã¿ãŸããã
ã©ããªå°é£ãç§ãã¡ãåŸ ã£ãŠããŸããïŒãŸãããŠãŒã¶ãŒã®IDã瀺ããã¹ãŠã®æžç±ã®åã远å ããå¿ èŠããããŸããç§ãä¿¡ããŠãã ãããããã¯csvãã¡ã€ã«ã§å¿«é©ã§ã¯ãããŸããããŸãããŠãŒã¶ãŒèªèº«ã远å ããå¿ èŠããããŸãïŒãããŠä»ã§ããçŽæããããã«ã¹ãã€ã®ä»£ããã«ãã³ãã©ã¯ã®3çªç®ã®ã³ã¬ã¯ã·ã§ã³ãèªã¿çµããŠããããšã劻ãèŠãªãããã«ããããã«ãäœããã®ããžãã¯ãå¿ èŠã§ãã
ãã®ãããžã§ã¯ããå¿ èŠãªèŠä»¶ã«æ¡åŒµããŠã¿ãŸãããã
ãŠãŒã¶ãŒã¢ã«ãŠã³ããäœæããæ©èœãããã«ãããåœŒã®æ¬ã®ãªã¹ããä¿æãã圌ãèªãã æ°ã远å ã§ããŸãã
æ£çŽãªãšãããäŸãæžãããã£ãã®ã§ããããããããªãããšããããããã£ãã®ã§ã欲æ±ãå€§å¹ ã«å€±ãããŸãã
ããŠãŒã¶ãŒã®æ¿èªãšããŒã¿ã®éä¿¡ãæ åœããã³ã³ãããŒã©ãŒã®äœæã
æ°ãããšã³ãã£ãã£Userã®äœæãããã³ãã®ãã³ãã©ãŒã
ããžãã¯ãã³ã³ãããŒã©ãŒèªäœã«ããã·ã¥ããŠè¥å€§åãããããå¥ã®ã¯ã©ã¹ã«ããã·ã¥ããŸãã
ãããŒã¿ããŒã¹ããæäœããããžãã¯ãæžãçŽããŸããããã¯ãçŸåšãŸãã¯2ã€ã®csvãã¡ã€ã«ãããããããŸãã¯ããŒã¿ããŒã¹ã«ç§»åããããã§ãã
ãã®çµæã倧ããªã¢ããªã¹ãã§ããŸãããããã¯æ¡åŒµããã®ãéåžžã«ãèŠçãã§ããããã«ã¯ãã¢ããªã±ãŒã·ã§ã³å ã«å€æ°ã®ç·å¯ãªãªã³ã¯ããããŸããç·å¯ã«ãã€ã³ãããããªããžã§ã¯ãã¯ãå¥ã®ãªããžã§ã¯ãã«äŸåããŸããã€ãŸããå¯çµåã®ã¢ããªã±ãŒã·ã§ã³ã§1ã€ã®ãªããžã§ã¯ãã倿Žããã«ã¯ãä»ã®å€ãã®ãªããžã§ã¯ãã倿Žããå¿ èŠããããŸããããã¯ãã¢ããªã±ãŒã·ã§ã³ãå°ããå Žåã¯é£ãããããŸãããããšã³ã¿ãŒãã©ã€ãºã°ã¬ãŒãã®ã¢ããªã±ãŒã·ã§ã³ã«å€æŽãå ããããšã¯éåžžã«å°é£ã§ãã
匱ãçµã³ã€ãã¯ã2ã€ã®ãªããžã§ã¯ããç¬ç«ããŠããŠãäžæ¹ã®ãªããžã§ã¯ããããã«äŸåããã«ããäžæ¹ã䜿çšã§ããããšãæå³ããŸãããã®ã¿ã€ãã®é¢ä¿ã¯ãããã³ã³ããŒãã³ãã®å€æŽãä»ã®ã³ã³ããŒãã³ãã®å€æŽãå¿ èŠãšãããªã¹ã¯ãæžããããã«ãã·ã¹ãã ã®ã³ã³ããŒãã³ãéã®çžäºäŸåæ§ãæžããããšãç®çãšããŠããŸãã
ãããã£ãŠããã®æ¹æ³ã®å©ç¹ã瀺ãããã«ãã¢ããªã±ãŒã·ã§ã³ããªããªã³ã¹ã¿ã€ã«ã§å®è£ ããããšããŸãã
ãªããªã³ã¢ãŒããã¯ãã£ã¯ãã¢ããªã±ãŒã·ã§ã³ãã¬ã€ã€ãŒã«åå²ããããšã§ããããã«ãã¢ãŒããã¯ãã£ã®äžå¿ã«ãã1ã€ã®ç¬ç«ããã¬ãã«ããããŸãã
ãªããªã³ã¢ãŒããã¯ãã£ã¯ãäŸåé¢ä¿ã®å転ã«å€§ããäŸåããŠããŸãããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã¯ãã€ã³ã¿ãŒãã§ã€ã¹ãä»ããŠããžãã¹ããžãã¯ãšå¯Ÿè©±ããŸãã
äŸåé¢ä¿ã®å転ã®åå
(Dependency Inversion Principle) , , . :
. .
. .
. .
. .
ãã®ã¹ã¿ã€ã«ã®å€å žçãªãããžã§ã¯ãã«ã¯ã次ã®4ã€ã®ã¬ã€ã€ãŒããããŸãã
- ãã¡ã€ã³ãªããžã§ã¯ãã¬ãã«ïŒã³ã¢ïŒ
- ãªããžããªã¬ãã«ïŒãªããžããªïŒ
- ãµãŒãã¹ã¬ãã«
- ããã³ããšã³ãã¬ã€ã€ãŒïŒWeb /ãŠããããã¹ãïŒïŒApiïŒ
ãã¹ãŠã®ã¬ã€ã€ãŒã¯äžå€®ïŒã³ã¢ïŒã«åããããŠããŸããã»ã³ã¿ãŒã¯ç¬ç«ããŠããŸãã
ãã¡ã€ã³ãªããžã§ã¯ãã¬ãã«
ããã¯ãããŒã¿ããŒã¹ã§åäœãããªããžã§ã¯ããèšè¿°ããã¢ããªã±ãŒã·ã§ã³ã®äžå¿çãªéšåã§ãã
ãœãªã¥ãŒã·ã§ã³ã«æ°ãããããžã§ã¯ããäœæããŠã¿ãŸãããããã®ãããžã§ã¯ãã®åºåã¿ã€ãã¯ãã¯ã©ã¹ã©ã€ãã©ãªãã§ããWebApiTest.Coreãšããååãä»ããŸãã
ããªããžã§ã¯ãã®å ±éã®ããããã£ãæã€BaseEntityã¯ã©ã¹ãäœæããŸãããã
BaseEntity.cs
public class BaseEntity
{
public int id { get; set; }
}
ãªãããã
, «id», , dateAdded, dateModifed ..
次ã«ãBaseEntityããç¶æ¿ããBookã¯ã©ã¹ãäœæããŸããã
Book.cs
public class Book: BaseEntity
{
public string name { get; set; }
public string author { get; set; }
public int pages { get; set; }
public int readedPages { get; set; }
}
{
public string name { get; set; }
public string author { get; set; }
public int pages { get; set; }
public int readedPages { get; set; }
}
ç§ãã¡ã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãããã§ä»ã®ãšããååãªã®ã§ã次ã®ã¬ãã«ã«é²ã¿ãŸãããã
ãªããžããªã¬ãã«
ããã§ã¯ããªããžããªã¬ãã«ã®å®è£ ã«ç§»ããŸããããWebApiTest.Repoãšããã¯ã©ã¹ã©ã€ãã©ãªãããžã§ã¯ããäœæããŸãã
äŸåé¢ä¿ã€ã³ãžã§ã¯ã·ã§ã³ ã䜿çšãããããã³ã³ã¹ãã©ã¯ã¿ãŒãä»ããŠãã©ã¡ãŒã¿ãŒãæž¡ãããã©ã¡ãŒã¿ãŒãããæè»ã«ããŸãããããã£ãŠãç·©ãçµåãããã¢ããªã±ãŒã·ã§ã³ãéçºã§ããããã«ããšã³ãã£ãã£æäœçšã®å ±éã®ãªããžããªã€ã³ã¿ãŒãã§ã€ã¹ãäœæããŸãã以äžã®ã³ãŒãã¹ããããã¯ãIRepositoryã€ã³ã¿ãŒãã§ã€ã¹çšã§ãã
IRepository.cs
public interface IRepository <T> where T : BaseEntity
{
IEnumerable<T> GetAll();
int Add(T item);
T Get(int id);
void Update(T item);
void Delete(T item);
void SaveChanges();
}
次ã«ãIRepositoryãå®è£ ãããšã³ãã£ãã£ã§ããŒã¿ããŒã¹æäœãå®è¡ãããªããžããªã¯ã©ã¹ãå®è£ ããŸãããããã®ãªããžããªã«ã¯pathToBaseãã©ã¡ãŒã¿ãæã€ã³ã³ã¹ãã©ã¯ã¿ãå«ãŸããŠããããããªããžããªã®ã€ã³ã¹ã¿ã³ã¹ãäœæãããšãã«ãã¡ã€ã«ãã¹ãæž¡ããŠãã¯ã©ã¹ãããŒã¿ã®ååŸå ãèªèã§ããããã«ããŸãã
CsvRepository.cs
public class CsvRepository<T> : IRepository<T> where T : BaseEntity
{
private List<T> list;
private string dbPath;
private CsvConfiguration cfg = new CsvConfiguration(CultureInfo.InvariantCulture)
{
HasHeaderRecord = false,
Delimiter = ";"
};
public CsvRepository(string pathToBase)
{
dbPath = pathToBase;
using (var reader = new StreamReader(pathToBase)) {
using (var csv = new CsvReader(reader, cfg)) {
list = csv.GetRecords<T>().ToList(); }
}
}
public int Add(T item)
{
if (item == null)
throw new Exception("Item is null");
var maxId = list.Max(x => x.id);
item.id = maxId + 1;
list.Add(item);
return item.id;
}
public void Delete(T item)
{
if (item == null)
throw new Exception("Item is null");
list.Remove(item);
}
public T Get(int id)
{
return list.SingleOrDefault(x => x.id == id);
}
public IEnumerable<T> GetAll()
{
return list;
}
public void SaveChanges()
{
using (TextWriter writer = new StreamWriter(dbPath, false, System.Text.Encoding.UTF8))
{
using (var csv = new CsvWriter(writer, cfg))
{
csv.WriteRecords(list);
}
}
}
public void Update(T item)
{
if(item == null)
throw new Exception("Item is null");
var dbItem = list.SingleOrDefault(x => x.id == item.id);
if (dbItem == null)
throw new Exception("Cant find same item");
dbItem = item;
}
ããŒã¿ããŒã¹ãæäœããããã«å¿ èŠãªãšã³ãã£ãã£ãšã³ã³ããã¹ããéçºããŸããã
ãµãŒãã¹ã¬ãã«
çŸåšãã¿ããã®ã¢ãŒããã¯ãã£ã®ç¬¬3å±€ã§ãããµãŒãã¹å±€ãäœæããŠããŸããWebApiText.Serviceãšããååãä»ããŸããããã®ã¬ã€ã€ãŒã¯ãWebã¢ããªã±ãŒã·ã§ã³ãšãªããžããªãããžã§ã¯ãã®äž¡æ¹ãšçžäºäœçšããŸãã
IBookServiceãšããååã®ã€ã³ã¿ãŒãã§ã€ã¹ãäœæããŸãããã®ã€ã³ã¿ãŒãã§ã€ã¹ã«ã¯ãBookãªããžã§ã¯ãã®å€éšã¬ã€ã€ãŒã«ãã£ãŠã¢ã¯ã»ã¹ããããã¹ãŠã®ã¡ãœããã®çœ²åãå«ãŸããŠããŸãã
IBookService.cs
public interface IBookService
{
IEnumerable<Book> GetBooks();
Book GetBook(int id);
void DeleteBook(Book book);
void UpdateBook(Book book);
void DeleteBook(int id);
int AddBook(Book book);
}
ããã§ã¯ãBookServiceã¯ã©ã¹ã«å®è£ ããŸãããã
BookService.cs
public class BookService : IBookService
{
private IRepository<Book> bookRepository;
public BookService(IRepository<Book> bookRepository)
{
this.bookRepository = bookRepository;
}
public int AddBook(Book book)
{
return bookRepository.Add(book);
}
public void DeleteBook(Book book)
{
bookRepository.Delete(book);
}
public void DeleteBook(int id)
{
var book = bookRepository.Get(id);
bookRepository.Delete(book);
}
public Book GetBook(int id)
{
return bookRepository.Get(id);
}
public IEnumerable<Book> GetBooks()
{
return bookRepository.GetAll();
}
public void UpdateBook(Book book)
{
bookRepository.Update(book);
}
}
å€éšã€ã³ã¿ãŒãã§ãŒã¹ã¬ãã«
ããã§ãã¿ããã®ã¢ãŒããã¯ãã£ã®æåŸã®ã¬ã€ã€ãŒãäœæããŸããããã¯ããã®å Žåãå€éšã¢ããªã±ãŒã·ã§ã³ïŒãããããã¹ã¯ããããªã©ïŒã察話ããå€éšã€ã³ã¿ãŒãã§ã€ã¹ã§ãããã®ã¬ã€ã€ãŒãäœæããã«ã¯ãBookã¯ã©ã¹ãåé€ããŠBooksControllerãã¯ãªãŒã³ã¢ããããããšã«ãããWebApiTest.Apiãããžã§ã¯ããã¯ãªãŒã³ã¢ããããŸãããã®ãããžã§ã¯ãã¯ããšã³ãã£ãã£ããŒã¿ããŒã¹æäœã®æ©äŒãšããããã®æäœãå®è¡ããããã®ã³ã³ãããŒã©ãŒãæäŸããŸãã
äŸåé¢ä¿ã€ã³ãžã§ã¯ã·ã§ã³ã®æŠå¿µã¯ASP.NETCoreã¢ããªã±ãŒã·ã§ã³ã®äžå¿ã§ãããããã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšããããã«äœæãããã¹ãŠã®ãã®ãç»é²ããå¿ èŠããããŸãã
äŸåæ§æ³šå ¥
ASP.NET MVCã®å°ããªã¢ããªã±ãŒã·ã§ã³ã§ã¯ãããããŒã¿ã³ã³ããã¹ãã䜿çšãã代ããã«ãå¥ã®ã¯ã©ã¹ã䜿çšãã代ããã«ãããã¯ã©ã¹ãå¥ã®ã¯ã©ã¹ã«æ¯èŒçç°¡åã«çœ®ãæããããšãã§ããŸãããã ããå€§èŠæš¡ãªã¢ããªã±ãŒã·ã§ã³ã§ã¯ãç¹ã«æ°çŸã®ã¡ãœãããæã€æ°åã®ã³ã³ãããŒã©ãŒãããå Žåããããè¡ãã«ã¯ãã§ã«åé¡ããããŸãããã®ç¶æ³ã§ã¯ãäŸåé¢ä¿ã®æ³šå ¥ãªã©ã®ã¡ã«ããºã ã圹ç«ã¡ãŸãã
ãŸããASP.NET 4ããã³ãã®ä»ã®ä»¥åã®ããŒãžã§ã³ã§ã¯ãNinjectãAutofacãUnityãWindsor CastleãStructureMapãªã©ã®ããŸããŸãªå€éšIoCã³ã³ããã䜿çšããŠäŸåé¢ä¿ãã€ã³ã¹ããŒã«ããå¿ èŠããã£ãå ŽåãASP.NETCoreã«ã¯ãã§ã«äŸåé¢ä¿ã€ã³ãžã§ã¯ã·ã§ã³ã³ã³ãããçµã¿èŸŒãŸããŠããŸãã IServiceProviderã€ã³ã¿ãŒãã§ã€ã¹ã§è¡šãããŸãããŸããäŸåé¢ä¿èªäœããµãŒãã¹ãšåŒã°ãããããã³ã³ãããŒããµãŒãã¹ãããã€ããŒãšåŒã¶ããšãã§ããŸãããã®ã³ã³ããã¯ãäŸåé¢ä¿ãç¹å®ã®ã¿ã€ãã«ãããã³ã°ããããŸããŸãªãªããžã§ã¯ãã«äŸåé¢ä¿ãæ¿å ¥ãã圹å²ãæãããŸãã
æåã¯ãããŒããªã³ã¯ã䜿çšããŠã³ã³ãããŒã©ãŒã§CsvDBã䜿çšããŠããŸããã
private CsvDB db;
public BookController()
{
db = new CsvDB();
}
äžèŠãããã«ã¯äœã®åé¡ããããŸããããããšãã°ãããŒã¿ããŒã¹æ¥ç¶ã¹ããŒã ã倿ŽãããŸãããCsvã®ä»£ããã«ãMongoDBãŸãã¯MySqlã䜿çšããããšã«ããŸãããããã«ãããã¯ã©ã¹ãå¥ã®ã¯ã©ã¹ã«åçã«å€æŽããå¿ èŠãããå ŽåããããŸãã
ãã®å ŽåãããŒããªã³ã¯ã¯ã³ã³ãããŒã©ãŒããªããžããªã®ç¹å®ã®å®è£ ã«ãã€ã³ãããŸãããã®ã³ãŒãã¯ãã¢ããªã±ãŒã·ã§ã³ã倧ãããªãã«ã€ããŠãä¿å®ããã¹ããé£ãããªããŸãããããã£ãŠãåºãçµåãããã³ã³ããŒãã³ãããç·©ãçµåãããã³ã³ããŒãã³ãã«ç§»è¡ããããšããå§ãããŸãã
ããŸããŸãªäŸåé¢ä¿æ³šå ¥ææ³ã䜿çšããŠãäœæãããµãŒãã¹ã®ã©ã€ããµã€ã¯ã«ã管çã§ããŸãã Depedency Injectionã«ãã£ãŠçæããããµãŒãã¹ã¯ã次ã®ããããã®ã¿ã€ãã«ãªããŸãã
- Transient: . , . ,
- Scoped: . , .
- Singleton: ,
察å¿ããAddTransientïŒïŒãAddScopedïŒïŒãããã³AddSingletonïŒïŒã¡ãœããã䜿çšããŠãçµã¿èŸŒã¿ã®.netã³ã¢ã³ã³ããã«åã¿ã€ãã®ãµãŒãã¹ãäœæããŸãã
æšæºã®ã³ã³ããïŒãµãŒãã¹ãããã€ããŒïŒã䜿çšããããšãã§ããŸããããã©ã¡ãŒã¿ãŒã®åãæž¡ãããµããŒãããŠããªããããAutofacã©ã€ãã©ãªã䜿çšããå¿ èŠããããŸãã
ãããè¡ãã«ã¯ãNuGetãä»ããŠAutofacãšAutofac.Extensions.DependencyInjectionã®2ã€ã®ããã±ãŒãžããããžã§ã¯ãã«è¿œå ããŸãã
ããã§ãStartup.csãã¡ã€ã«ã®ConfigureServicesã¡ãœãããæ¬¡ã®ããã«å€æŽããŸãã
ConfigureServices
public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.AddMvc();
var builder = new ContainerBuilder();//
builder.RegisterType<CsvRepository<Book>>()// CsvRepository
.As<IRepository<Book>>() // IRepository
.WithParameter("pathToBase", @"C:\csv\books.csv")// pathToBase
.InstancePerLifetimeScope(); //Scope
builder.RegisterType<BookService>()
.As<IBookService>()
.InstancePerDependency(); //Transient
builder.Populate(services); //
var container = builder.Build();
return new AutofacServiceProvider(container);
}
ãã®ããã«ããŠããã¹ãŠã®å®è£ ããããã®ã€ã³ã¿ãŒãã§ãŒã¹ã«ãã€ã³ãããŸããã
WebApiTest.Apiãããžã§ã¯ãã«æ»ããŸãããã
æ®ã£ãŠããã®ã¯BooksController.csã倿Žããããšã ãã§ã
BooksController.cs
[Route("[controller]")]
[ApiController]
public class BooksController : ControllerBase
{
private IBookService service;
public BooksController(IBookService service)
{
this.service = service;
}
[HttpGet]
public ActionResult<IEnumerable<Book>> Get()
{
return new JsonResult(service.GetBooks());
}
[HttpGet("{id}")]
public ActionResult<Book> Get(int id)
{
return new JsonResult(service.GetBook(id));
}
[HttpPost]
public void Post([FromBody] Book item)
{
service.AddBook(item);
}
[HttpPut("{id}")]
public void Put([FromBody] Book item)
{
service.UpdateBook(item);
}
[HttpDelete("{id}")]
public void Delete(int id)
{
service.DeleteBook(id);
}
}
F5ããŒãæŒãããã©ãŠã¶ãéãã®ãåŸ ã¡ã/ booksã«ç§»åããŠ...
[{"name":"Test","author":"Test","pages":100,"readedPages":0,"id":1}]
çµæïŒ
ãã®ããã¹ãã§ã¯ãåžžã«Autofacã䜿çšããŠãOnionã®ã¢ãŒããã¯ãã£ãã¿ãŒã³ãšäŸåé¢ä¿ã®æ¿å ¥ã«é¢ãããã¹ãŠã®ç¥èãæŽæ°ããããšæããŸããã
èªãã§ãããŠããããšããç®æšã¯éæããããšæããŸã;ïŒ
nå±€
n- .
â . . , .
. ( ). , . . , - .
â . . , .
. ( ). , . . , - .