一 簡單介紹
StructureMap is the oldest, continuously used IoC/DI container for .Net dating back to its first public release and production usage all the way back in June 2004 on .Net 1.1. The current 4.* release represents 12+ years of lessons learned in the StructureMap and greater .Net community -- while also wiping away a great deal of legacy design decisions that no longer make sense today.
StructureMap是.Net最早的,連續使用的IoC / DI容器,可以追溯到2004年6月在.Net 1.1上的第一次公開發布和生產使用。 當前的4. *版本代表了在StructureMap和更大的.Net社區中學到的12年多的經驗教訓 - 同時也消除了大量遺留的設計決策,這些決策今天已經不再有意義了。
StructureMap是一個IOC框架,至於什么是IOC不做過多解釋,網上有很多資料,這里主要是演示下簡單的用法
簡單用法
-
新建控制台項目,項目結構如下
-
新建Interfacec層,Service層和Repository層,分別表示接口層,業務層和數據倉儲層,Service有兩個,主要演示了Setter和Ctor注冊兩種情況
Interface層
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Learn_StructureMap.Interface { public interface IOrderRepository { void GetOrdersByUserId(string userId); } } using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Learn_StructureMap.Interface { public interface IOrderService { void GetOrdersByUserId(string userId); } } using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Learn_StructureMap.Interface { public interface IUserRepository { void GetUserById(int id); } } using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Learn_StructureMap.Interface { public interface IUserService { void GetUserById(int id); } }
Service層
using Learn_StructureMap.Interface; using System; namespace Learn_StructureMap.Service { public class UserService : IUserService { private IUserRepository userRepository; public UserService(IUserRepository userRepository) { this.userRepository = userRepository; } public void GetUserById(int id) { Console.WriteLine("UserService 執行"); this.userRepository.GetUserById(10); } } } using Learn_StructureMap.Interface; using StructureMap.Attributes; using System; namespace Learn_StructureMap.Service { public class OrderService : IOrderService { [SetterProperty] public IOrderRepository orderRepository { get; set; } public void GetOrdersByUserId(string userId) { Console.WriteLine("OrderService 執行"); this.orderRepository.GetOrdersByUserId(userId); } } }
Repository層
using System; using Learn_StructureMap.Interface; namespace Learn_StructureMap.Init { public class OrderRepository : IOrderRepository { public void GetOrdersByUserId(string userId) { Console.WriteLine("OrderRepository 執行"); } } } using Learn_StructureMap.Interface; using System; namespace Learn_StructureMap.DataAccess { public class UserRepository : IUserRepository { public void GetUserById(int id) { Console.WriteLine("UserRepository 執行"); } } }
接下來最重要的,初始化IOC容器,將需要的服務注入到該容器之后,在需要的地方就可以直接拿來用了
using StructureMap; namespace Learn_StructureMap.Init { public class ContainerFactory { public static Container container = null; static ContainerFactory() { container = new Container(); container.Configure(it => { it.AddRegistry<IOCRegister>(); }); } } } using Learn_StructureMap.DataAccess; using Learn_StructureMap.Interface; using Learn_StructureMap.Service; using StructureMap; namespace Learn_StructureMap.Init { public class IOCRegister : Registry { public IOCRegister() { //Service //setter inject For<IOrderService>().Singleton().Use<OrderService>().Setter<IOrderRepository>().Is<OrderRepository>(); //ctor inject For<IUserService>().ContainerScoped().Use<UserService>().Ctor<IUserRepository>().Is<UserRepository>(); //Repository For<IUserRepository>().Singleton().Use<UserRepository>(); For<IOrderRepository>().Singleton().Use<OrderRepository>(); } } }
UI層,主要演示如何獲取服務,並調用服務方法
using Learn_StructureMap.Init; using Learn_StructureMap.Interface; using System; namespace Learn_StructureMap { class Program { static void Main(string[] args) { var container = ContainerFactory.container; IUserService userService = container.GetInstance<IUserService>(); userService.GetUserById(10); IOrderService orderService = container.GetInstance<IOrderService>(); orderService.GetOrdersByUserId("u1"); Console.ReadKey(); } } }
-
運行結果如下: