IOC框架---StructureMap


一 簡單介紹

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不做過多解釋,網上有很多資料,這里主要是演示下簡單的用法

簡單用法

  1. 新建控制台項目,項目結構如下

  2. 新建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();
            }
        }
    }
    
    
  3. 運行結果如下:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM